2011-10-25 15 views
30

Desidero avere un dizionario che contenga un insieme di transizioni di stato. Ho presunto che avrei potuto farlo usando states = defaultdict (None), ma non funzionava come mi aspettavo. Per esempio:defaultdict (None)

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

avrei pensato che gli stati [ "Stato 1"] restituirebbe il valore None e che se NEW_STATE è un bool che avrei ottenuto False per NEW_STATE = Uniti [ "Stato 1! "], ma invece ottengo un KeyError.

Cosa sto sbagliando?

Grazie,

Barry

risposta

53

defaultdict richiede un richiamabile come argomento che fornisce il default-valore quando viene richiamato senza argomenti. None non è richiamabile. Quello che vuoi è questo:

defaultdict(lambda: None) 
+7

Non del tutto; 'None' è in realtà l'argomento predefinito per' defaultdict() '. Ma la tua soluzione è ancora buona :) –

+0

@Tim: hai ragione, ma la soluzione rimane la stessa. –

+0

[confuso] Cosa è "non proprio" qui? mi sono perso una modifica precedente che non è stata mantenuta dal sistema? Non vedo nulla di sbagliato nella spiegazione o nella risposta di Bjorn. –

0

Credo che avrei potuto anche fare questo:

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

Ma io preferisco di gran lunga il metodo defaultdict.

9

In questo caso l'uso, non utilizzare defaultdict a tutti - una pianura dict farà bene:

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

Il metodo dict.get() restituisce il valore per una data chiave, o un valore predefinito se il la chiave non è stata trovata Il valore predefinito è impostato su None.