下面是一个示例代码,演示了装饰器的工作原理。它需要一个函数get_text(name)
并用函数p_decorate(func)
包装它。
我无法理解函数p_decorate如何知道参数name
是func
的提供参数?由于func
定义中的p_decorate
没有参数?有人可以解释一下。到目前为止,我知道装饰器如何使用没有参数的函数,但这让我很头疼。
def get_text(name): #This is fine
return "lorem ipsum, {0} dolor sit amet".format(name)
def p_decorate(func):
def func_wrapper(name): #How does it know that name is part of func?
return "<p>{0}</p>".format(func(name))
return func_wrapper
my_get_text = p_decorate(get_text)
print my_get_text("John")
输出:
<p>lorem ipsum, John dolor sit amet</p>
答案 0 :(得分:2)
编写该装饰器的开发人员对该名称进行了硬编码。 Python只知道这一点,因为代码的作者将该名称放在那里。它只是局部变量的符号名称。
换句话说,命名函数参数没有什么神奇之处。你可以将它命名为完全不同的东西,代码仍然可以正常工作:
def p_decorate(func):
def func_wrapper(arg1):
return "<p>{0}</p>".format(func(arg1))
return func_wrapper
请注意,该变量与name
函数中的get_text()
局部变量没有关系!同样,这只是 函数中的局部变量名。对于位置参数,重要的是调用时参数的相对位置。传递给functioncall(...)
的第一个值被分配给被调用函数内的第一个局部变量名。
所有这些对装饰者来说都不是特别的,这适用于所有功能。