手动调用带参数的装饰器

时间:2014-01-29 19:48:08

标签: python decorator

我有一个函数f1:

def f1():
  return True

我还有一个带参数的装饰器,可以像这样使用:

@validate_arguments(arg1, arg2)

我尝试在没有f1的情况下手动调用@(用于测试和重复使用),但这似乎不起作用。

类似于:

validate_arguments(f1, arg1, arg2)

它不起作用的原因是因为validate_arguments是一个将参数作为参数的函数,并且包含一个作为实际装饰器的闭包。

有没有办法做我想要的?对于没有@的函数,手动调用装饰器,对于带参数的装饰器?

1 个答案:

答案 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