传递参数给装饰器函数

3
有人能告诉我如何将参数传递给装饰器调用函数吗?
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个回答

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))

2
这是最常见、最强大、最(通常)Pythonic的方式。 - Jacob Zimmerman
1
@Afiz,不仅仅是“也可以工作”,在你的第一个例子中它同样有效,而另一个则不行。 - glglgl

3

如果你在Onefunc()中设置了一个参数,那么在doubleIn()函数中也应该传递一个参数:

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

@doubleIt
def Onefunc(x):
    return x

print(Onefunc(5))

我认为如果您需要更多信息,应该添加注释。 - Zeinab Abbasimazar
1
@ZeinabAbbasi:不,这是可行的代码,并且它一个答案。 - Remi Guan
抱歉,我误解了你的第一个表达式! - Zeinab Abbasimazar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接