gpt4 book ai didi

python - 修饰函数的参数如何工作?

转载 作者:行者123 更新时间:2023-12-02 18:31:39 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com