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
参数?我将描述我是如何理解这个过程的。
- 我们创建了一个带有
name
参数的 get_text
函数
- 我们使用
func
参数创建装饰器函数 p_decorate
,这显然是我们的 get_text
函数
- 当我们调用
p_decorate(get_text)
时,p_decorate
的 func
参数成为我们的 get_text
函数
- 内部
func_wrapper
函数可以访问外部作用域,因此它可以随心所欲地使用 func
(又名 get_text
)。但是它怎么知道 get_text
的 name
参数呢?此外,它从哪里得到这个论点(因为它不抱怨缺少 name
)?毕竟我们不提供给get_text
。
- ???
在这种情况下,name
将成为传递给您的函数的参数。在其他情况下,我们对函数了解不多,我们可以使用 *args
和 **kwargs
,而装饰器中有 name
。实际上存在一个非常简洁的解释 here.
我正在尝试使用装饰器并发现它们很酷,但我不完全理解内部发生的事情。让我们假设一个我从有关装饰器的页面中借用的简单示例。
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
参数?我将描述我是如何理解这个过程的。
- 我们创建了一个带有
name
参数的get_text
函数 - 我们使用
func
参数创建装饰器函数p_decorate
,这显然是我们的get_text
函数 - 当我们调用
p_decorate(get_text)
时,p_decorate
的func
参数成为我们的get_text
函数 - 内部
func_wrapper
函数可以访问外部作用域,因此它可以随心所欲地使用func
(又名get_text
)。但是它怎么知道get_text
的name
参数呢?此外,它从哪里得到这个论点(因为它不抱怨缺少name
)?毕竟我们不提供给get_text
。 - ???
在这种情况下,name
将成为传递给您的函数的参数。在其他情况下,我们对函数了解不多,我们可以使用 *args
和 **kwargs
,而装饰器中有 name
。实际上存在一个非常简洁的解释 here.