2017-10-04 131 views
2

在Python中,我对装饰器有所了解。 在我可怜的理解任何装饰功能与原函数构造一个装饰funtion投资申报表(最合理,这应该是一个可调用的):在Python中使用参数进行装饰意味着什么?

def deco(func): 
    def func_wrapper(name): 
     return func(name)+", how are you?" 
    return func_wrapper 

@deco 
def foo(name): 
    return "Hello "+name 

print(foo("Michael")) 

这给:

Hello Michael, how are you? 

但是,如果一个装饰器指定连同一个参数:

def deco2(info): 
    def info_decorator(func): 
     def func_wrapper(name): 
      return func(name) + info 
     return func_wrapper 
    return info_decorator 

@deco2(", how are you?") 
def foo2(name): 
    return "Hello "+name 

print(foo2("Regina")) 

给予

Hello Regina, how are you? 

什么是处理这个装饰器的“规则”? 它似乎,不用返回foo2的Python首先调用deco2与给定Arg和假设,此调用首先构造一个工厂的装饰,然后就像之前foo2的传递给它的顺序返回最终的包装。然而,在这种情况下,有一个额外的“”涉及(三个而不是两个),这使我很难确定一般规则。

+2

你的第二个装饰器相当于:'foo2 = deco2(“,你好吗?”)(foo2)'放在'foo2'之后。 –

+0

我知道,但在第一种情况下,它只是:foo = deco(foo)'放在foo之后。它是从哪个Python知道添加额外的间接装饰器的参数? – michael

回答

3

如果您应用修饰符而没有参数,例如, @foo,那么装饰器将正在装饰的函数作为它的参数,并且预期将返回将替换装饰函数的任何可调用函数。

如果您应用修饰器的论点,例如, @foo('bar'),那么装饰器预计会返回一个可调用的函数,它将装饰的函数作为它的参数,并返回并调用它来代替装饰的函数。换句话说,没有参数的修饰器只需要被修饰的函数,但是一个带参数的修饰器需要它自己的参数它需要获得某个被修饰的函数的保留。由于装饰器的参数是任意的,并且没有任何限制,所以很难提出任何非限制性的规则来解决如何将装饰器另外传递给装饰器的问题。在这种情况下,应用两步过程:获取装饰器参数,然后返回装饰器的另一个可调用对象。

+0

然后它按我的预期工作,尽管它有点奇怪...... – michael