[Python-es] Equivalente a __missing__ para el setter

Alexis Roda alexis.roda.villalonga en gmail.com
Mar Oct 12 14:50:35 CEST 2010


En/na Garito ha escrit:
> Eso es justo lo que me queria evitar con un casting pero parece que eso 
> no es posible en python, cierto?
> 
> Podria ser esto otra forma:
> 
> En el __setitem__ del yDict habria que poner un trozo de codigo que 
> recorriese los dict para convertirlos a yDict

Debería funcionar, pero la clase se está volviendo más compleja e 
ineficiente cada vez y la cosa no termina aquí. Si d es un yDict y 
d["a/b/c"] = "d"

* cual es el resultado de "a/b" in d ? Si la respuesta es True debes 
redefinir el método __contains__

* d.get("a/b") devuelve el yDict {"c":"d"} ? Si la respuesta es sí debes 
redefinir el método get

* d.keys() devuelve ["a"], ["a/b/c"] o ["a", "a/b", "a/b/c"] ? Si la 
respuesta no es ["a"] debes redefinir el método.

* que devuelve d.values(), los values de primer nivel ? los finales ?

* que ocurre si haces d["x/y"] = { "foo" : "bar" } ? d["x/y/foo"] == 
"bar" o dispara un KeyError ?


El uso de una estructura recursiva introduce una sobrecarga importante: 
por un lado se realizan un montón de llamadas a funciones y por otro 
debes garantizar que la estructura siga siendo recursiva al modificarla.


Llegado a este punto me plantearía si vale la pena seguir por este camino:

* ¿ realmente necesitas que yDict implemente toda la interfaz de un 
diccionario ?

* ¿ es imprescindible utilizar recursividad ?




Saludos


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