Function decorator having arguments is complicated

Maxime S maxischmeii at
Mon Apr 27 16:42:17 CEST 2015

Le lun. 27 avr. 2015 à 04:39, Makoto Kuwata <kwa at> a écrit :
> If function decorator notation could take arguments,
> decorator definition would be more simple:
>   def multiply(func, n):
>     def newfunc(*args, **kwargs):
>       return n * func(*args, **kwargs)
>     return newfunc
>   @multiply 4      # ex: @decorator arg1, arg2, arg3
>   def f1(x, y):
>     return x+y
> How do you think about this idea?

David Beazley has a nice trick [1] to allow optional argument in decorators:

def logged(func=None, level=logging.DEBUG, message=None):
    if func is None:
        return partial(logged, level=level, message=message)

    def wrapper(*args, **kwargs):
        log.log(level, message)
        return func(*args, **kwargs)
    return wrapper

I think that solve your problem nicely, and that it is quite readable.

[1] Amongst a heap of other cool tricks, in his Python Cookbook


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the Python-list mailing list