我有一个函数f1:
def f1():
return True
我还有一个带参数的装饰器,可以像这样使用:
@validate_arguments(arg1, arg2)
我尝试在没有f1
的情况下手动调用@
(用于测试和重复使用),但这似乎不起作用。
类似于:
validate_arguments(f1, arg1, arg2)
它不起作用的原因是因为validate_arguments
是一个将参数作为参数的函数,并且包含一个作为实际装饰器的闭包。
有没有办法做我想要的?对于没有@
的函数,手动调用装饰器,对于带参数的装饰器?
答案 0 :(得分:14)
您需要以下内容:
def f1():
return True
f1 = validate_arguments(arg1, arg2)(f1)
这里validate_arguments(arg1, arg2)
返回实际的装饰器,我们传递函数对象f1
到装饰器,然后返回新修改的函数。
<强>演示:强>
def validate_arguments(arg1, arg2):
def decorator(func):
def wrapped():
print arg1, arg2
return func()
return wrapped
return decorator
def f1():
return True
f1 = validate_arguments(1, 2)(f1)
print f1()
#1 2
#True