2011-10-25 19 views
30

Deseo tener un diccionario que contenga un conjunto de transiciones de estado. Supuse que podía hacer esto usando states = defaultdict (None), pero no funcionaba como esperaba. Por ejemplo:defaultdict (Ninguno)

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

yo habría pensado que los estados [ "estado 1"] devolvería el valor Ninguno y que si new_state es un bool que me habría conseguido False para new_state = estados [ "Estado 1! "], pero en su lugar obtengo un KeyError.

¿Qué estoy haciendo mal?

Gracias,

Barry

Respuesta

53

defaultdict requiere un exigible como argumento que proporciona el valor por defecto cuando se invoca sin argumentos. None no se puede llamar. Lo que se quiere es la siguiente:

defaultdict(lambda: None) 
+7

No del todo; 'None' es en realidad el argumento predeterminado para' defaultdict() '. Pero tu solución sigue siendo buena :) –

+0

@Tim: tienes razón, pero la solución sigue siendo la misma. –

+0

[confuso] ¿Qué es "no exactamente" aquí? ¿Perdí una edición anterior que no fue retenida por el sistema? No veo nada incorrecto con la explicación o respuesta de Bjorn tal como está. –

0

supongo que también podría hacer esto:

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

Pero yo prefiero mucho el método defaultdict.

9

En este caso de uso, no utilice defaultdict en todos - una llanura dict no tendrán ningún problema:

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

El método dict.get() devuelve el valor de una clave dada, o un valor predeterminado si el la clave no se encuentra El valor predeterminado es por defecto None.