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

标签 python python-decorators

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/

相关文章:

python - 多个 python 装饰器

python - 我可以对多个属性使用相同的@property setter 吗?

python - 装饰一个构造函数有参数的类

python - 设置 app.yaml url 处理程序时,如何将 url 格式化为脚本?

python - 使用 pysftp 从 SFTP 服务器下载文件到本地计算机时出现 PermissionError

python - 创建一个组合两个函数的装饰器,而不指定原始函数的调用签名

django - 如何将装饰器应用于 django 中(模块的)所有 View

python - 如何在 pandas python 的 isocalendar 函数中应用系列

python - 打包 Docopt CLI 应用程序

python - PyMuPDF - 读/写文本框