2016-07-30 7 views
0

デコレータ楽しい!
私は期待通り「関数ディスパッチ辞書」辞書を作成するためのPythonデコレータ

デコレータ「ASSIGN1」の辞書を作成する作成したいと思います:

デコレータ私は辞書値にタプルを作ってみる「ASSIGN2」、物事は少し奇妙な取得

d1 = dict() 
d2 = dict() 
assign1 = lambda d, k: lambda f: d.setdefault(k, f) 
assign2 = lambda d, k, s: lambda f: d.setdefault(k, (f,s)) 

@assign1 (d1, 'FW') 
@assign1 (d1, 'PW') 
def func1(): 
    pass 

@assign2 (d2, 'FW', 'XX') 
@assign2 (d2, 'PW', 'XD') 
@assign2 (d2, 'DF', 'XC') 
def func2(): 
    pass 

print ('assign1') 
for k in d1: 
    print ('{0} : {1}'.format(k, d1[k])) 

print('assign2') 
for k in d2: 
    print ('{0} : {1}'.format(k, d2[k])) 


#Output 
assign1 
FW : <function func1 at 0x000000000311F400> 
PW : <function func1 at 0x000000000311F400> 
assign2 
DF : (<function func2 at 0x000000000311F510>, 'XC') 
FW : (((<function func2 at 0x000000000311F510>, 'XC'), 'XD'), 'XX') 
PW : ((<function func2 at 0x000000000311F510>, 'XC'), 'XD') 

答えて

1

それはトリッキーだが、ここであなたが見つけることができる方法である:

In [55]: func1() 
In [56]: func2() 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-57-dff3c14b0386> in <module>() 
----> 1 func2() 

TypeError: 'tuple' object is not callable 

何?! func2はタプルになりましたか?

はいです。 setdefaultメソッドは、設定した値を返します。最初のケースではfunc1に設定されていたので、2番目のケースではタプルとなり、そのタプルは次のデコレータに適用されました。

関連する問題