[Python-es] Equivalente a __missing__ para el setter

Alexis Roda alexis.roda.villalonga en gmail.com
Lun Oct 11 10:15:06 CEST 2010


En/na Garito ha escrit:
> yDict({"a": {"b": {"c": "abc"}}}) -> {'a': {'b': {'c': 'abc'}}}

Para que yDict funcione todo valor que no sea "final" debe ser a su vez 
un yDict (es una estructura recursiva). Si pasas una serie de 
diccionarios anidados al constructor este no los convierte en yDict.

Para verlo más claro añade el método:

     def __repr__(self) :
         return "<yDict {%s}>" % ", ".join(
             ["%r : %r" % (k, v) for k, v in self.items()]
             )


In [1]: d = yDict({"a": {"b": {"c": "abc"}}})
In [2]: d
Out[2]: <yDict {'a' : {'b': {'c': 'abc'}}}>
In [3]: dd = yDict()
In [4]: dd["a/b/c"] = "abc"
In [5]: dd
Out[5]: <yDict {'a' : <yDict {'b' : <yDict {'c' : 'abc'}>}>}>

En [2] los diccionarios "interiores" no son instancias de yDict, en [5] 
sí. Deberás redefinir '__init__' para que la instancia se inicialice 
correctamente. También deberás redefinir el método 'setdefault' y 
posiblemente otros para garantizar que la semántica de yDict sea 
consistente.





Saludos


Más información sobre la lista de distribución Python-es