Meta decorator with parameters, defined in explicit functions

Lawrence D’Oliveiro lawrencedo99 at gmail.com
Fri Jul 1 18:08:22 EDT 2016


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__)
        return \
            decorate
    #end decorator_with_args



More information about the Python-list mailing list