2016-05-17 12 views
0

引数を変更するが、私の機能のワークフローを変えるために、私は複数のデコレータを使用しようとしているコードのこの部分で、この奇妙な動作 を示しpythonの複数のデコレータは、私はPythonのデコレータを理解しようと

これはコード

です
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}) 

そして、これはmyduplicatorでデコレータの2回目の呼び出しは、変更データの結果を持っている理由を答え

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} 

ある

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

です。それはdictを変異させる。同じdictを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

をそして、私は適用したい場合、私は何ができるか二度デコレータを次の?私は嚥下のコピーの構造/ dictを行う必要がありますか? –

関連する問題