我们是否必须在装饰器的包装函数中使用函数值?
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
在这种情况下)将在包装函数中使用。
当我对上面的代码尝试相同时,我得到一个 TypeError
,display()
需要一个参数。
现在很困惑,在这种情况下,我的所有 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
,则必须定义它以获取参数。
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()
接受一个参数时,代码起作用了
问题不在于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
,则必须定义它以获取参数。