Python装饰组成

时间:2017-06-27 14:03:09

标签: python function python-decorators

下面是一个示例代码,演示了装饰器的工作原理。它需要一个函数get_text(name)并用函数p_decorate(func)包装它。

我无法理解函数p_decorate如何知道参数namefunc的提供参数?由于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>

1 个答案:

答案 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(...)的第一个值被分配给被调用函数内的第一个局部变量名。

所有这些对装饰者来说都不是特别的,这适用于所有功能。