Function decorator having arguments is complicated
Maxime S
maxischmeii at gmail.com
Mon Apr 27 10:42:17 EDT 2015
Le lun. 27 avr. 2015 à 04:39, Makoto Kuwata <kwa at kuwata-lab.com> 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)
@wraps(func)
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
Regards,
Maxime
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20150427/f8f8c22e/attachment.html>
More information about the Python-list
mailing list