【问题标题】:Passing arguments to decorator function将参数传递给装饰器函数
【发布时间】:2015-12-27 09:20:41
【问题描述】:

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

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() 函数来处理它。

【问题讨论】:

    标签: python python-decorators


    【解决方案1】:

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

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

    【讨论】:

    • 这是最常见、最强大且(通常)Pythonic 的方式。
    • @Afiz,它不仅“也有效”,它在您的第一个示例中也有效,而另一个则没有。
    【解决方案2】:

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

    def doubleIt(Onefunc):
        def doubleIn(x):
            return Onefunc(x)*Onefunc(x)
        return doubleIn
    
    @doubleIt
    def Onefunc(x):
        return x
    
    print(Onefunc(5))
    

    【讨论】:

    • 如果您需要更多信息,我认为您应该发表评论。
    • @ZeinabAbbasi:不,这是工作代码,它是答案。
    • 对不起;我误解了你的第一句话!
    猜你喜欢
    • 2021-11-21
    • 2014-11-17
    • 2016-02-14
    • 2021-11-15
    • 1970-01-01
    • 2018-08-24
    • 2014-10-01
    • 2021-08-06
    • 2020-12-18
    相关资源
    最近更新 更多