Hola! Me gusta el codigo de Alexis pero no acaba de ir bien Este codigo
def __getitem__(self, clave): partes = clave.split('/') if len(partes) > 1: return super(yDict, self).__getitem__(partes[0])['/'.join(partes[1:])] else: return dict.__getitem__(self, partes[0]) devuelve este error 1.- a = yDict({"a": {"b": {"c": "abc"}}}) -> {'a': {'b': {'c': 'abc'}}} Traceback (most recent call last): File "yDict.py", line 43, in <module> print '2.- a["a/b/c"] -> %s' % a['a/b/c'] File "yDict.py", line 10, in __getitem__ if len(partes) > 1: return super(yDict, self).__getitem__(partes[0])['/'.join(partes[1:])] KeyError: 'b/c' Lo que me induce a pensar que la 3a linea (if len(partes) > 1) no esta haciendo lo que se supone que deberia hacer Alguien me puede dar algo de luz al respecto, no veo porque super(yDict, self).__get__item__(partes[0]) funciona bien pero el siguiente accesor se ejecuta el del tipo nativo (dict) y no el indicado en el proxy (yDict) Gracias!!! El 9 de octubre de 2010 23:28, Garito <gar...@gmail.com> escribió: > > > El 9 de octubre de 2010 23:13, Alexis Roda < > alexis.roda.villalo...@gmail.com> escribió: > > En/na Garito ha escrit: >> >> Me gustaria que el acceso a estas funciones sea recursivo >>> >> >> ¿ por algún motivo en especial ? >> >> Si, claro. Desde mi analisis la naturaleza es claramente fractal y la base > para la fractalidad es la recursividad > Ahorra codigo y convierte el que pones en algo donde la responsabilidad > bien colocada es un gol extra > >> >> > La pregunta seria: hay alguna forma de cambiarle el tipo >> > (momentaneamente) sin crear otro objeto? O dicho de otra forma: puedo >> > hacer un cast momentaneo? >> >> Creo que lo que buscas es 'super': >> >> class yDict(dict) : >> def __getitem__(self, clave): >> partes = clave.split('/', 1) >> if len(partes) > 1 : >> return super(yDict, self).__getitem__(partes[0])[partes[1]] >> else: >> return super(yDict, self).__getitem__(partes[0]) >> >> def __setitem__(self, clave, valor) : >> partes = clave.split("/", 1) >> if len(partes) > 1 : >> super(yDict, self).setdefault(partes[0], yDict())[partes[1]] = >> valor >> else : >> super(yDict, self).__setitem__(partes[0], valor) >> > > Podria ser perfectamente, revisare este codigo a ver que me surge, gracias! > > >> >> ¿Que debería ocurrir con este código? >> >> d = yDict() >> d["a/b"] = 1 >> > > d = {'a': {'b': 1}} > > >> d["a/b/c"] = 2 > > > d = {'a': {'b': {'c': 2}}} > > Gracias por tu ayuda, parece que tu y yo seguimos teniendo esa relacion de > siempre en estas listas > Saludos > >> > > >> >> >> Saludos >> >> _______________________________________________ >> Python-es mailing list >> Python-es@python.org >> http://mail.python.org/mailman/listinfo/python-es >> FAQ: http://python-es-faq.wikidot.com/ >> > > > > -- > Mi twitter: http://twitter.com/garito > > Temet nosce > -- Mi twitter: http://twitter.com/garito Temet nosce
_______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/