[Python-es] Equivalente a __missing__ para el setter
Garito
garito en gmail.com
Lun Oct 11 03:29:50 CEST 2010
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 <garito en gmail.com> escribió:
>
>
> El 9 de octubre de 2010 23:13, Alexis Roda <
> alexis.roda.villalonga en 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 en 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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20101011/8c30340d/attachment.html>
Más información sobre la lista de distribución Python-es