var = float(input('Enter a number: '))
def math_test(func):
def wrapper(*args, **kwargs):
func(var)
return wrapper
@math_test
def times10(x):
print(x * 10)
times10()
为什么当我调用函数times10()
时,我不需要将参数var
放在括号中?
当我调用 func()
时没有输入参数 var
时,出现错误,提示需要位置参数 x
.. .so当我将var
放入times10()
时,我得到了同样的错误。
但是,当我将参数放入 func()
时,它工作得很好。
包装函数不应该知道 times10()
中的参数(即 var
)也应该是 func()< 中的参数吗?/
?
编辑:
var = float(input('Enter a number: '))
def math_test(func):
def wrapper(*args, **kwargs):
func(*args, **kwargs)
return wrapper
@math_test
def times10(x):
print(x * 10)
times10(var)
最佳答案
这个装饰函数:
@math_test
def times10(x):
print(x * 10)
将被翻译为:
times10 = math_test(times10)
这意味着 times10
现在相当于:
def wrapper(*args, **kwargs):
func(var)
其中可调用的func
指向times10
的原始实现。为了进一步形象化这一点,可以将其视为如下:
def times10(*args, **kwargs):
def original_times10(x):
print(x * 10)
original_times10(var)
- 如果您调用与上面的
original_times10(var)
同义的func(var)
,那么它会起作用,因为original_times10
已传递var
将放置参数x
。 - 如果您调用与上面的
original_times10()
同义的func()
,它显然不起作用,因为original_times10
需要输入x
但你还没有传递任何东西。
请注意,您尝试执行的操作是严格将固定参数 var
传递给 times10
的原始实现:
func(var)
根据您的用例,我相信您应该做的是传递实际参数:
func(*args, **kwargs)
这样,无论您传递给 times10
的修饰函数,都将传递给 times10
的原始实现。
关于python - 修饰函数的参数如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69331854/