将参数传递给装饰器函数

时间:2015-12-27 09:20:42

标签: python python-decorators

有谁能告诉我如何将参数传递给装饰器调用函数?

def doubleIt(Onefunc):
    def doubleIn():
        return Onefunc()*Onefunc()
    return doubleIn

@doubleIt
def Onefunc():  
    return 5

print(Onefunc()) # it prints out 25. 

但是当我尝试将Onefunc()升级为:

@doubleIt
def Onefunc(x):
    return x

我面临以下错误:

TypeError                                 
Traceback (most recent call last)
<ipython-input-17-6e2b55c94c06> in <module>()
      9 
     10 
---> 11 print(Onefunc(5))
     12 

TypeError: doubleIn() takes 0 positional arguments but 1 was given

错误是不言自明的,但我不确定如何更新doubleIn()函数来处理它。

2 个答案:

答案 0 :(得分:5)

您需要传递可选的位置和关键字参数。

from functools import wraps

def doubleIt(Onefunc):

    @wraps(Onefunc)
    def doubleIn(*args, **kwargs):
        return Onefunc(*args, **kwargs) * Onefunc(*args, **kwargs)
    return doubleIn

@doubleIt
def Onefunc(x):
    return x

print(Onefunc(5))

答案 1 :(得分:3)

如果在doubleIn()中设置参数,您还应该在Onefunc()函数中传递参数:

def doubleIt(Onefunc):
    def doubleIn(x):
        return Onefunc(x)*Onefunc(x)
    return doubleIn

@doubleIt
def Onefunc(x):
    return x

print(Onefunc(5))