Python 手动调用接受参数的装饰器

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\

我有一个函数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\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的值。