2016-07-30 18 views
0

Decorator Spaß!
Ich möchte eine ‚Funktion Dispatch Wörterbuch‘ schafftPython Decorator zum Erstellen von Wörterbuch

Dekorateur ‚ASSIGN1‘ ein Wörterbuch erstellen, wie erwartet:

Dekorateur ‚Assign2‘ Ich versuche, das Wörterbuch Wert eines Tupels zu machen, werden die Dinge ein wenig seltsam

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') 

Antwort

1

Es ist schwierig, aber hier ist, wie Sie herausfinden können:

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 

Was ?! func2 ist jetzt ein Tupel ???

Ja ist es. Die Methode setdefault gibt den von Ihnen festgelegten Wert zurück. Im ersten Fall funktionierte es, weil Sie es auf func1 setzten, aber im zweiten Fall wurde es ein Tupel, und dieses Tupel wurde auf den nächsten Dekorator angewendet und so weiter ...