这位装饰师的装饰师做了什么?

时间:2016-07-21 14:15:55

标签: python python-2.7 decorator python-decorators

我正在阅读this answer以了解装饰器是什么以及它们可以做什么,我的问题从中出现。作者提供了一个奖励片段,它可以使任何装饰者一般接受任何参数,这个片段让我很困惑:

def decorator_with_args(decorator_to_enhance):
    def decorator_maker(*args, **kwargs):
        def decorator_wrapper(func):
            return decorator_to_enhance(func, *args, **kwargs)
        return decorator_wrapper
    return decorator_maker

@decorator_with_args 
def decorated_decorator(func, *args, **kwargs): 
    def wrapper(function_arg1, function_arg2):
        print "Decorated with", args, kwargs
        return func(function_arg1, function_arg2)
    return wrapper

@decorated_decorator(42, 404, 1024)
def decorated_function(function_arg1, function_arg2):
    print "Hello", function_arg1, function_arg2

decorated_function("Universe and", "everything")

输出:

Decorated with (42, 404, 1024) {}
Hello Universe and everything

我的问题是: decorator_with_args究竟做了什么?

似乎它需要一个装饰器作为它的参数,用一个接受任意参数的装饰器包装器包装它,这些参数传递给参数装饰器,然后返回装饰器制造商。这意味着decorator_with_args实际上将装饰器变成了装饰器制造者。听起来不可能,对吧?无论如何,我认为告诉它的功能是很棘手的。

是的,原始代码包含很多注释,但我没有从中得到答案,所以我删除了它们以使代码更短更清晰。

1 个答案:

答案 0 :(得分:1)

简而言之,decorator_with_args会像这样调用函数调用:

function(func, *args, **kwargs)

到这种形式:

function(*args, **kwargs)(fund)

请注意,两个函数调用都返回另一个函数。