2016-07-30 83 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,但在第二種情況下它變成了一個元組,並且該元組被應用到下一個裝飾器,等等......