【问题标题】:Do we have to use the function value in wrapped function of a decorator?我们必须在装饰器的包装函数中使用函数值吗?
【发布时间】:2019-11-06 17:39:32
【问题描述】:
def div2(mult):
    def display():

        print(f"we are doing a check of multiples if div by 2")
        if mult%2==0:
            return f"{mult} is divisible"
    return display

@div2
def multi(n):
    return n*n*n

print(multi(5))

在一个视频中,我了解到我们不需要为包装函数传递参数(例如显示),主函数的参数(在这种情况下为div2)将在包装函数中使用。 当我对上面的代码尝试相同的操作时,我得到了一个 TypeError display() 需要一个参数。

现在很困惑,在这种情况下,我的所有 3 个函数都应该具有如下参数: div2() -> multi() 函数本身作为参数 display() -> 显示函数值的参数multi() multi() -> 用于计算的参数

注意:当我让display() 带一个参数时,代码起作用了

【问题讨论】:

    标签: python python-3.x parameters python-decorators


    【解决方案1】:

    问题不在于display 不接受参数;就是您像使用它一样使用它。请记住,装饰器语法只是

    的语法糖
    def multi(n):
        return n*n*n
    
    multi = div2(multi)
    

    div2 的结果不需要保留 div2 参数的签名,但您必须先知道它是否保留,然后才能使用该结果。

    div2 的参数是一个函数,不是你可以除以 2 的东西。你的装饰器应该是

    def div2(f):
        def display(x):
            print(f"We are doing a check of multiples if div by 2")
            if f(x) % 2 == 0:
                return f"{x} is divisible"
        return display
    
    @div2
    def multi(n):
        return n*n*n
    
    prin(multi(5))
    

    【讨论】:

    • 感谢您的澄清
    【解决方案2】:

    这里 multi 接受一个参数,命名为n

    def multi(n):
        return n*n*n
    

    而使用装饰器语法其实和做的一样:

    multi = div2(multi)
    

    因此,如果您希望能够将参数传递给包装器display,则必须对其进行定义以获取参数。

    【讨论】:

      猜你喜欢
      • 2018-01-02
      • 2021-04-06
      • 2011-06-25
      • 2015-09-29
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      相关资源
      最近更新 更多