Varias veces (incluso varias seguidas) Me ha picado el error de defaultdict: olvidar que algo es en realidad un default y tratarlo como un diccionario normal.¿Cómo puedo hacer que un fallo predeterminado sea seguro para los clientes no habituales?
d = defaultdict(list)
...
try:
v = d["key"]
except KeyError:
print "Sorry, no dice!"
Para aquellos que han sido mordidos también, el problema es evidente: cuando d no tiene 'clave' clave, el v = d["key"]
crea mágicamente una lista vacía y lo asigna a ambos d["key"]
y v
en lugar de lanzar una excepción. Lo cual puede ser bastante difícil de rastrear si d viene de algún módulo cuyos detalles uno no recuerda muy bien.
Estoy buscando una manera de quitarle el aguijón a este error. Para mí, la mejor solución sería deshabilitar de algún modo la magia de un defecto predeterminado antes de devolverlo al cliente.
Muchas gracias por ponerme en el camino correcto con esto. No tengo ningún problema particular con el cambio del comportamiento de este tipo de objeto porque creo que es mucho mejor comprobar si un objeto admite un protocolo en particular que verificar su tipo. En este caso, simplemente cheching si es compatible con el protocolo de mapeo es mucho mejor que verificar a la defensiva si un diccionario podría ser un default y cambiar el comportamiento del cliente en consecuencia. – user354193
¿Qué quiere decir con "no me gusta la idea de un objeto que cambia repentinamente de comportamiento"? Si digo 'd = dict (d)' en vez de 'd.default_factory = None', a menos que pase la referencia a la antigua 'd' es funcionalmente equivalente y no fuerza la creación de un nuevo diccionario. Mientras el código subsiguiente no intente restaurar la fábrica (suena loco) es un pato. –