Meta decorator with parameters, defined in explicit functions
Ian Kelly
ian.g.kelly at gmail.com
Sat Jul 2 01:09:10 EDT 2016
On Fri, Jul 1, 2016 at 4:08 PM, Lawrence D’Oliveiro
<lawrencedo99 at gmail.com> wrote:
> On Tuesday, June 28, 2016 at 5:03:08 PM UTC+12, Ben Finney wrote:
>> There is a clever one-line decorator that has been copy-pasted without
>> explanation in many code bases for many years::
>>
>> decorator_with_args = lambda decorator: lambda *args, **kwargs: lambda func: decorator(func, *args, **kwargs)
>>
>
> For those who want docstrings, I’ll give you docstrings:
>
> def decorator_with_args(decorator) :
> "given function decorator(func, *args, **kwargs), returns a decorator which," \
> " given func, returns the result of decorator(func, *args, **kwargs)."
>
> def decorate(*args, **kwargs) :
>
> def generated_decorator(func) :
> return \
> decorator(func, *args, **kwargs)
> #end generated_decorator
>
> #begin decorate
> generated_decorator.__name__ = "decorator_{}".format(decorator.__name__)
> generated_decorator.__doc__ = "decorator which applies {} to the previously-specified arguments".format(decorator.__name__)
> return \
> generated_decorator
> #end decorate
>
> #begin decorator_with_args
> decorate.__name__ = "decorate_with_{}".format(decorator.__name__)
> decorate.__doc__ = "generates a decorator which applies {} to the given arguments".format(decorator.__name__)
You should use functools.wraps instead of clobbering the decorated
function's name and docstring:
@functools.wraps(decorator)
def decorate(*args, **kwargs):
...
> return \
> decorate
Just to satisfy my own curiosity, do you have something against
putting the return keyword and the returned expression on the same
line?
More information about the Python-list
mailing list