Skip to main content

dek: the decorator-decorator

Project description

dek decorates your decorators to diminish defects and drudgery.

Writing a Python decorator with no parameters is easy.

But writing a decorator with parameters requires three nested levels of function and offers several opportunities for error, more if you want to be able to decorate classes like unittest.mock.patch does.

dek is a decorator for decorators that handles all this.


Write a decorator print_before that prints a function’s arguments with a label when it executes.

# Without dek all is confusion

import functools

def print_before(label='label'):
    def deferred(func):
        def wrapped(*args, **kwargs):
            print(label, args, kwargs)
            return func(*args, **kwargs)

        return wrapped

    if callable(label):
        return deferred(label)

    return deferred

# Things go clearer with dek
from dek import dek

def print_before(func, label='debug'):
    print(label, func)
    return func()

# Or use defer mode for more control
def print_before(func, label='debug'):
    def wrapped(foo, bar):
        print(label, foo, bar)
        return func(foo, bar)

    return wrapped


Decorators can be called in many ways:

  • @print_before

  • @print_before()

  • @print_before('debug')

  • @print_before(label='debug')

  • @print_before('debug', verbose=True)

This article talks more about decorators that take parameters.

For advanced problems, the PyPi library decorator does not do what dek does, but does pretty anything else you could conceive of in a decorator library.


dek.dek(decorator, defer=False, methods=None)

(, 85-214)

Decorate a decorator so it works with or without parameters and can decorate all the members of a class.

dek has two modes, simple and defer. Simple mode, the default, is less work but offers less control.

In simple mode, decorator is a single function that whose first parameter is “the call that would have been made”, represented as a functools.partial().

This means the trivial decorator, the decorator that does nothing, is trivial to write:

def trivial(func):
    return func()

Decorators with parameters aren’t much harder:

def print_before(func, label='debug'):
    print(label, func.__name__, *args)
    return func()

def do_stuff(a, b='default'):
   # do stuff

# also prints 'debug do_stuff 1'

In defer mode, decorator is a function that returns a function that does the work. This is more code but more flexible.

def trivial(func):
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)

    return wrapper

def print_before(func, label='label'):
    def wrapper(foo, bar):
        print(label, foo, bar)
        return func(foo, bar)

    return wrapper

The methods parameter describe how classes (as opposed to functions or methods) are decorated. It works in either simple or defer mode.

  • If methods is None then classes are decorated like any callable. If methods is _not_ None then classes are not decorated

  • If methods is a string then only methods whose names start with that string are decorated (which means that if methods is the empty string, that all methods are decorated).

  • If methods is a callable then only methods that return true when passed to the callable are decorated

  • If methods is True then only public, non-magic methods - methods whose names do not start with _ - are decorated

  • If methods is False then methods are not decorated (and neither is the class)

(automatically generated by doks on 2020-07-07T19:28:41.272716)

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dek-0.10.3.tar.gz (4.0 kB view hashes)

Uploaded source

Built Distribution

dek-0.10.3-py3-none-any.whl (7.9 kB view hashes)

Uploaded py3

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Fastly Fastly CDN Google Google Object Storage and Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page