2011-10-25 13 views
30

Chciałbym mieć słownik, który zawiera zestaw przejść między stanami. Przypuszczałem, że mogę to zrobić używając stanów = defaultdict (None), ale nie działa zgodnie z oczekiwaniami. Na przykład:defaultdict (None)

states = defaultdict(None) 
if new_state_1 != states["State 1"]: 
    dispatch_transition() 

bym nie pomyślał, że stany [ „Stan 1”] zwróci wartość None, a jeśli NEW_STATE jest bool, że chciałbym zdobyć Fałsz dla NEW_STATE = Zjednoczone [ "Stan 1! "], ale zamiast tego otrzymuję błąd KeyError.

Co robię źle?

Dzięki,

Barry

Odpowiedz

53

defaultdict wymaga wywoływalnym jako argument, który zapewnia domyślną wartość, gdy wywołana bez argumentów. None nie można wywołać. Co chcesz to:

defaultdict(lambda: None) 
+7

Niezupełnie; 'Brak' jest w rzeczywistości domyślnym argumentem dla' defaultdict() '. Ale twoje rozwiązanie jest nadal dobre :) –

+0

@Tim: Masz rację, ale rozwiązanie pozostaje takie samo. –

+0

[zdezorientowany] Co tu jest "niezupełnie"? czy brakowało mi wcześniejszej edycji, która nie została zachowana przez system? Nie widzę niczego niewłaściwego w wyjaśnieniu lub odpowiedzi Bjorna, tak jak jest. –

0

Chyba mogę też to zrobić:

states = {} 
... 
if not new_state_1 in states or new_state_1 != states["State 1"]: 
    dispatch_transition() 

Ale wolę metodę defaultdict.

9

W tym przypadku użycia, nie należy używać defaultdict w ogóle - zwykły dict wystarczyć:

states = {} 
if new_state_1 != states.get("State 1"): 
    dispatch_transition() 

Sposób dict.get() zwraca wartość dla danego klucza lub wartości domyślnej, jeśli klucz nie został znaleziony. Domyślna wartość to None.

Powiązane problemy