Python 手动调用接受参数的装饰器
我有一个函数f1:Python 手动调用接受参数的装饰器,python,decorator,Python,Decorator,我有一个函数f1: def f1(): return True 我还有一个接受参数的装饰器,可以这样使用: @validate_arguments(arg1, arg2) 我试图在没有@的情况下手动调用f1(用于测试和重用),但这似乎不起作用 比如: validate_arguments(f1, arg1, arg2) def f1(): return True f1 = validate_arguments(arg1, arg2)(f1) 它不起作用的原因是,validate\
def f1():
return True
我还有一个接受参数的装饰器,可以这样使用:
@validate_arguments(arg1, arg2)
我试图在没有@
的情况下手动调用f1
(用于测试和重用),但这似乎不起作用
比如:
validate_arguments(f1, arg1, arg2)
def f1():
return True
f1 = validate_arguments(arg1, arg2)(f1)
它不起作用的原因是,validate\u arguments
是一个函数,它将参数作为参数,并包含一个作为实际装饰器的闭包
没有办法做我想做的事吗?要手动调用不带
@
的函数上的装饰器,对于接受参数的装饰器?您需要以下内容:
validate_arguments(f1, arg1, arg2)
def f1():
return True
f1 = validate_arguments(arg1, arg2)(f1)
在这里,validate_参数(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
稍微相关:如果您希望在不传入函数的情况下调用装饰器(例如,装饰器在全局范围内执行其工作):
u装饰器(lambda:None)(
当f1是带有参数的函数时,例如f1(argX,argY),则手动装饰函数的定义如下:手动装饰的\u f1=验证参数(1,2)(lambda:f1(3,4)),其中3和4是argX和argY的值。