Python: 如何在装饰器中处理函数参数?

Python: How is the function argument treated inside a decorator?

我正在尝试使用装饰器并发现它们很酷,但我不完全理解内部发生的事情。让我们假设一个我从有关装饰器的页面中借用的简单示例。

def p_decorate(func):
   def func_wrapper(name):
       return "<p>{0}</p>".format(func(name))
   return func_wrapper


def get_text(name):
   return "lorem ipsum, {0} dolor sit amet".format(name)


get_text = p_decorate(get_text)
print(get_text("John"))

p_decorate 函数中让我感到困惑的是我们从哪里得到 name 参数?我将描述我是如何理解这个过程的。

  1. 我们创建了一个带有 name 参数的 get_text 函数
  2. 我们使用 func 参数创建装饰器函数 p_decorate,这显然是我们的 get_text 函数
  3. 当我们调用 p_decorate(get_text) 时,p_decoratefunc 参数成为我们的 get_text 函数
  4. 内部 func_wrapper 函数可以访问外部作用域,因此它可以随心所欲地使用 func(又名 get_text)。但是它怎么知道 get_textname 参数呢?此外,它从哪里得到这个论点(因为它不抱怨缺少 name)?毕竟我们不提供给get_text
  5. ???

在这种情况下,name 将成为传递给您的函数的参数。在其他情况下,我们对函数了解不多,我们可以使用 *args**kwargs,而装饰器中有 name。实际上存在一个非常简洁的解释 here.