【发布时间】:2020-11-12 00:08:40
【问题描述】:
我正在学习 Python 装饰器,但在理解将参数传递给装饰函数的工作原理时遇到了一些困难。我不是谈论将参数传递给装饰器本身,而是讨论原始函数需要额外参数的情况。例如,我试图理解以下简单示例(代码 sn-p 的学分转到this 答案):
def decorator(fn):
def wrapper(arg1, arg2):
print("I got args! Look: {0}, {1}".format(arg1, arg2))
fn(arg1, arg2)
return wrapper
@decorator
def print_full_name(first_name, last_name):
print("My name is {0} {1}".format(first_name, last_name))
print_full_name("John", "Doe")
# outputs:
# I got args! Look: John Doe
# My name is John Doe
因此,如果我通过删除包装器的参数arg1 和arg2 故意破坏代码,则会收到以下错误:TypeError: wrapper() takes 0 positional arguments but 2 were given。对我来说很奇怪,当包装器在定义时没有括号内的任何参数时,它需要 2 个参数。另外,我不清楚 如何 first_name 和 last_name 参数值“映射”到包装函数的参数。我们只将这些参数传递给print_full_name 函数,但似乎它们也传递给了wrapper 函数。也许这与事情的运行顺序有关,但这对我来说并不清楚。
我知道这里有很多关于这个主题的很好的答案,但我找不到能清楚解释这个特定部分的答案。任何帮助将不胜感激。
【问题讨论】: