not - El default de Python que no inserta valores perdidos
name ''defaultdict'' is not defined (1)
Puedes subclasificar dict
e implementar __missing__
:
class missingdict(dict):
def __missing__(self, key):
return ''default'' # note, does *not* set self[key]
Manifestación:
>>> d = missingdict()
>>> d[''foo'']
''default''
>>> d
{}
También podría subclasificar el defaultdict
, obtendría el manejo de fábrica más la copia y el soporte de pickle arrojados:
from collections import defaultdict
class missingdict(defaultdict):
def __missing__(self, key):
return self.default_factory()
Manifestación:
>>> from collections import defaultdict
>>> class missingdict(defaultdict):
... def __missing__(self, key):
... return self.default_factory()
...
>>> d = missingdict(list)
>>> d[''foo'']
[]
>>> d
defaultdict(<type ''list''>, {})
pero, como puede ver, el __repr__
miente sobre su nombre.
Por lo tanto, la documentación de default menciona que, si falta un elemento, el valor devuelto por default_factory
"se inserta en el diccionario para la clave y se devuelve". Eso es genial la mayor parte del tiempo, pero lo que realmente quiero en este caso es que el valor sea devuelto pero no insertado en el default.
Pensé que probablemente podría subclasificar el default y anular ... ¿Supongo que __missing__
? No es seguro. ¿Cuál es la mejor manera de hacerlo?
Gracias por adelantado.