【问题标题】:How do the arguments of a decorated function work?装饰函数的参数如何工作?
【发布时间】:2021-11-18 17:34:23
【问题描述】:
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放在括号里?

当我没有输入参数 var 时,当我调用 func() 时,我收到一个错误,说需要位置参数 x...所以当我将 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)

【问题讨论】:

  • "无法添加图片内联,我没有足够的声誉提前道歉。" - 您应该将代码发布为代码格式的文本,而不是图像。
  • 好的。我会尝试编辑它。
  • @user2357112supportsMonica 我修好了。
  • @ddejohn 是如何使主体中的所有代码看起来像这样的?是不是``````
  • wrapper返回func(*args, **kwargs),从math_test返回wrapper

标签: python python-decorators


【解决方案1】:

这个装饰函数:

@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)
  • 如果您调用func(var),它是上面original_times10(var) 的同义词,那么它会起作用,因为original_times10 被传递var,这将被放入参数x
  • 如果您调用func()(上面与original_times10() 同义),它显然不起作用,因为original_times10 需要输入x,但您没有传递任何内容。

请注意,您要做的是将固定参数 var 严格传递给 times10 的原始实现:

func(var)

根据您的用例,我相信您应该做的是传递实际参数:

func(*args, **kwargs)

这样,您传递给times10 的修饰函数的任何内容都将传递给times10 的原始实现。

【讨论】:

    猜你喜欢
    • 2018-07-07
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2014-07-21
    • 2020-11-12
    • 2010-12-30
    • 1970-01-01
    相关资源
    最近更新 更多