2013-03-15 170 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