当我重新研究一下decorators时,我偶然发现了一些相当混乱的代码,这些代码在传递变量和函数时让我感到困惑。你知道吗
def get_text(name):
return "lorem ipsum, {0} dolor sit amet".format(name)
def p_decorate(func):
def func_wrapper(name):
return "<p>{0}</p>".format(func(name))
return func_wrapper
my_get_text = p_decorate(get_text)
print my_get_text("John")
# <p>Outputs lorem ipsum, John dolor sit amet</p>
我理解将函数作为变量传递的概念(这很酷),但是它被多次传递的方式让我困惑。my_get_text
已被分配给具有参数的函数(另一个函数)。然而,就在那之后,我们引用这个新变量并将参数传递给它(“John”)。“约翰”在func_wrapper()
中的传递方式也令人困惑。你知道吗
my_get_text
如何接收更多参数,以及如何将其传递给内部函数?你知道吗
谢谢
这是一个decorator如何工作的演示:它们基本上将decorator函数包装到另一个内部函数中并返回其引用。你知道吗
my_get_text = p_decorate(get_text)
调用函数p_decorate
,可包装函数作为参数(get_text
)。你知道吗name
。这个返回值被赋给变量名my_get_text
my_get_text
现在是可调用的,因为它是一个函数引用。你知道吗my_get_text
,它将调用由装饰器创建的函数,并将参数name
(在您的例子中是'John'
)交给您。你知道吗<p>
-标记并在它们之间推送一个字符串。这个字符串是从步骤1中提供给decorator的函数调用中获得的:它是经过修饰的调用的返回值。你知道吗顺便说一下,由于每次修饰函数时都会重新定义函数
func_wrapper
(请参见闭包),因此返回值是指向全新函数的函数引用。比较内存地址:
函数是用非常相同的调用定义的,但是由于它们是闭包,函数指针指向另一个内存地址(即不同的函数)。你知道吗
相关问题 更多 >
编程相关推荐