2016-05-17 91 views
0

我試着去了解蟒蛇裝飾,但我表現出這種奇怪的行爲 在這段代碼我已經嘗試使用多種裝飾爲改變我的功能流程蟒蛇多個裝飾更改參數

這是代碼

def myfilter(f): 
    def decorator(data): 
     if data['num'] %2 == 0: 
      data['num'] = 90 
     f(data) 

    return decorator 

def myduplicator(f): 
    def decorator(data): 
     print 'duplicator data', data 
     f(data) 
     print 'duplicator data', data 
     f(data) 
    return decorator 

@myduplicator 
@myfilter 
def testone(data): 
    print data 

for i in range(3): 
    testone({'num': i}) 

這就是答案

duplicator data {'num': 0} 
{'num': 90} 
duplicator data {'num': 90} 
{'num': 90} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 2} 
{'num': 90} 
duplicator data {'num': 90} 
{'num': 90} 

爲什麼裝飾的myduplicator第二個電話有變更數據導致

print 'duplicator data', data 
f(data) 

的結果,我想是

duplicator data {'num': 0} 
{'num': 90} 
duplicator data {'num': 0} 
{'num': 90} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 2} 
{'num': 90} 
duplicator data {'num': 2} 
{'num': 90} 

回答

2

因爲那是裝飾做什麼。它改變了字典。由於您使用了相同的字典兩次,它已被第一次調用修改。

0

應用這兩個裝飾後,你testone功能等同於以下內容:

def testone(data): 
    print 'duplicator data', data 
    if data['num'] %2 == 0: 
     data['num'] = 90 
    print(data) 
    print 'duplicator data', data 
    if data['num'] %2 == 0: 
     data['num'] = 90 
    print(data) 

你可以在這裏看到,同樣data被修改兩次。

現在,如果我運行這個功能它提供了類似的結果:

>>> for i in range(3): 
...  testone({'num': i}) 
duplicator data {'num': 0} 
{'num': 90} 
duplicator data {'num': 90} 
{'num': 90} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 1} 
{'num': 1} 
duplicator data {'num': 2} 
{'num': 90} 
duplicator data {'num': 90} 
{'num': 90} 
+0

如果我想套用如下裝飾兩次我能做些什麼?我必須做一個燕子副本結構/字典? –