2013-03-15 95 views
0

假设你有下面的代码:装饰在Python

def addTags(functionHere): 
    def wrapper(): 
     return "NumberTag" + functionHere() + "NumberTagOver" 
    return wrapper 

@addTags 
def numbers(firstValue, secondValue): 
    return firstValue + secondValue 

然后把号码(4,5)到解释吐回迹说,包装带任何参数。好吧,然后把数字()放入解释器后面,这个数字需要两个参数!困惑。

回答

6

你的包装函数替换了包装函数,并且需要匹配它所需的参数个数。你的包装函数有两个参数(firstValue, secondValue),但你的包装根本没有。

你可以这两个添加到您的装饰包装太:

def addTags(functionHere): 
    def wrapper(firstValue, secondValue): 
     return "NumberTag" + functionHere(firstValue, secondValue) + "NumberTagOver" 
    return wrapper 

但绑你的装饰到特定的功能。

有一个小窍门,但是你可以使用:

def addTags(functionHere): 
    def wrapper(*args): 
     return "NumberTag" + functionHere(*args) + "NumberTagOver" 
    return wrapper 

*args位置参数作为一个包罗万象的,对该函数的所有位置参数,现在传递到包装的函数。

没有为关键字参数也等价物:

def addTags(functionHere): 
    def wrapper(*args, **kw): 
     return "NumberTag" + functionHere(*args, **kw) + "NumberTagOver" 
    return wrapper 
+0

谢谢!老实说,这是我见过的装饰师最好的见解之一。 – 2013-03-15 17:59:18