[Python-es] Equivalente a __missing__ para el setter
Garito
garito en gmail.com
Lun Oct 11 05:31:05 CEST 2010
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 <garito en 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 <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
>
--
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/c68f7fa4/attachment.html>
Más información sobre la lista de distribución Python-es