我正在阅读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
实际上将装饰器变成了装饰器制造者。听起来不可能,对吧?无论如何,我认为告诉它的功能是很棘手的。
是的,原始代码包含很多注释,但我没有从中得到答案,所以我删除了它们以使代码更短更清晰。
答案 0 :(得分:1)
简而言之,decorator_with_args
会像这样调用函数调用:
function(func, *args, **kwargs)
到这种形式:
function(*args, **kwargs)(fund)
请注意,两个函数调用都返回另一个函数。