为什么将带有 n 个参数的函数传递给包含 0 个参数的装饰函数的子函数时抛出错误消息

Why is an error msg thrown when a function taking n parameters is passed to a sub function of a decorator function which contains 0 arguments

我是 python 的新手,正在尝试了解语言的功能和特性。 当我 运行 下面的代码时,我收到错误消息 "wrap() takes 0 positional arguments but 2 were given"

class dec:

def decorator_function(orig):
    def wrap():
        print('hi')
        return orig
    return wrap

@decorator_function
def display_inf(name, age):
    print('dispInf ran with args ({},{})'.format(name,age))

display_inf('John',35)

我明白错误消息是什么,如果我更改包装函数以包含如下 2 个参数,我将不会收到此消息。然而,我不明白为什么 python 会抛出错误。 display_inf 函数按预期传递给 decorator_function,但是就 wrap 函数而言,它所做的只是打印 hi。它甚至没有使用该功能,所以如果我不使用它,为什么我仍然会收到此错误。导致错误的幕后原因。

def decorator_function(orig):
    def wrap(name, age):
        print('hi')
        return orig
    return wrap

当您使用装饰器时,您的原始功能替换为装饰器的return值。在您的示例中,display_inf 替换为 wrap。由于 wrap 不接受任何参数,因此当您尝试使用参数调用它时,它会失败。

您似乎认为 wrap 将被调用一次并且应该 return 新函数,但事实并非如此。装饰器本身 (decorator_functrion) return 是新函数,在您的情况下 return 是 wrapwrap 永远无法实际打印任何内容,因为它使用错误数量的参数调用。