Hola de nuevo! Perdonad el trasiego pero intento encontrar el problema Parece que es de concepto
en class yDict(dict) dict es una superclase de yDict por lo que yDict es una subclase de dict por tanto super(yDict, partes[0]) falla pues partes[0] es un dict Habria un base(yDict, partes[0]) que hiciese el proceso inverso de super? Gracias! El 11 de octubre de 2010 03:29, Garito <gar...@gmail.com> escribió: > 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 > -- 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/