我们是否必须在装饰器的包装函数中使用函数值?

Do we have to use the function value in wrapped function of a decorator?

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 在这种情况下)将在包装函数中使用。 当我对上面的代码尝试相同时,我得到一个 TypeErrordisplay() 需要一个参数。

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

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

问题不在于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))

这里multi取一个参数,命名为n.

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

并且使用装饰器语法实际上是一样的:

multi = div2(multi)

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