[python-madrid] Problema con __getattr__

Miguel Angel miguelangel.garcia at gmail.com
Sat Apr 14 13:55:03 CEST 2012


Hola a todos.

Disculpad que haya tardado tanto en responder, pero he estado con mil
historias.

El resultado final es:

class EasyDict(dict):    def __setattr__(self, name, value):
self[name] = value    def __getattr__(self, name):        return
self[name]


Realmente lo tenía funcionando cuando lo mandé, ya que ya había probado a
heredar de "object", pero el problema principal estaba en la llamada a esta
clase.

Si sentís curiosidad por ver el resto del cuadro, lo acabo de subir a
bitbucket: http://kcy.me/801v Se aceptan sugerencias :D

Un saludo y gracias a todos.
El 12 de abril de 2012 13:09, Vicente Ruiz <vruiz2.0 at gmail.com> escribió:

> Según tengo yo entendido, antes de la versión 2.1 o 2.2, se diferenciaban
> "tipos" y "clases" y la construcción de éstas era distinta. En esa versión
> de Python aparece el new-style que trata de unificar esto, por eso ahora
> todo hereda de object (si es new-style, claro). Por compatibilidad se ha
> mantenido el old-style, pero este desaparece completamente en Python 3.
>
> Un ejemplo de old-style:
>
> class MiNuevoTipo:
>   ...
>
> class UnaClaseDe(MiNuevoTipo):
>  ...
>
> las diferencias técnicas, ya no las conozco, yo me crié con el new-style :)
>
> Un saludo,
> Vicente Ruiz
>
> El 12 de abril de 2012 12:50, Andrey Antoukh <andsux at gmail.com> escribió:
>
> A grandes rasgos, lo que hacen es añadir mas metodos. Es lo mas
>> perceptible. Por otro lado nos encontramos que el comportamiento de la
>> clase cambia, sobretodo cuando juegas con metaclases.
>>
>> No soy un experto en ello pero recomiendo leer:
>> http://www.python.org/doc/newstyle/
>>
>> Andrei.
>>
>> El 12 de abril de 2012 12:45, piranna at gmail.com <piranna at gmail.com>escribió:
>>
>> Alguien me puede explicar las diferencias entre old-classes y
>>> new-classes? Porque aparte de que las nuevas tienen mas metodos no veo
>>> ninguna... :-(
>>>
>>> Sent from my Android cell phone, please forgive the lack of format on
>>> the text, and my fat thumbs :-P
>>> El 12/04/2012 10:31, "Andrey Antoukh" <andsux at gmail.com> escribió:
>>>
>>> Solución a eso: no uses twisted \o/ ( ahí solté mi primer troll del día )
>>>>
>>>> El 12 de abril de 2012 10:26, Manuel de la Peña <etil15 at gmail.com>escribió:
>>>>
>>>>>
>>>>> On Apr 12, 2012 10:17 AM, "Vicente Ruiz" <vruiz2.0 at gmail.com> wrote:
>>>>> >
>>>>> > Yo seguía con el ejemplo de Miguel Angel en la cabeza :D
>>>>> >
>>>>>
>>>>> Es que yo como Andrei, nada de old class, menos en twisted :(
>>>>>
>>>>> > El 12 de abril de 2012 10:10, Manuel de la Peña <etil15 at gmail.com>
>>>>> escribió:
>>>>> >
>>>>> >> Estaba asumiendo que se extendida de object como mínimo :)
>>>>> >>
>>>>> >> On Apr 12, 2012 9:30 AM, "Vicente Ruiz" <vruiz2.0 at gmail.com> wrote:
>>>>> >>>
>>>>> >>> Coincido con Andrei :)
>>>>> >>>
>>>>> >>> En cuanto a lo que comentas, Manuel, no puedes llamar al padre
>>>>> usando old-style, la que estarías mezclando objetos y tipos. Para mantener
>>>>> la interfaz de getattr funciona así:
>>>>> >>>
>>>>> >>> class EasyDict:
>>>>> >>>     def __init__(self):
>>>>> >>>         self._values = {}
>>>>> >>>
>>>>> >>>     def add(self, k, v):
>>>>> >>>         self._values[k] = v
>>>>> >>>
>>>>> >>>     def __getattr__(self, name):
>>>>> >>>         if name in self._values:
>>>>> >>>             return self._values[name]
>>>>> >>>         raise AttributeError
>>>>> >>>
>>>>> >>>     def __str__(self):
>>>>> >>>         return str(self._values)
>>>>> >>>
>>>>> >>> y creo que te referías a este otro cuando hablas de llamar al
>>>>> padre:
>>>>> >>>
>>>>> >>> class EasyDict(dict):
>>>>> >>>     def add(self, k, v):
>>>>> >>>         self[k] = v
>>>>> >>>
>>>>> >>>     def __getattr__(self, name):
>>>>> >>>         try:
>>>>> >>>             return super(EasyDict, self).__geattr__(name)
>>>>> >>>         except AttributeError:
>>>>> >>>             if name in self:
>>>>> >>>                 return self[name]
>>>>> >>>             raise AttributeError
>>>>> >>>
>>>>> >>> al estar extendiendo un diccionario propiamente dicho, aquí si
>>>>> puedes hacer la llamada al padre.
>>>>> >>>
>>>>> >>> Un saludo,
>>>>> >>> Vicente Ruiz
>>>>> >>>
>>>>> >>> El 12 de abril de 2012 09:23, Andrey Antoukh <andsux at gmail.com>
>>>>> escribió:
>>>>> >>>>
>>>>> >>>> Usar oldclass hoy en día debe ser un crimen penal! xD
>>>>> >>>>
>>>>> >>>> Andrei. ;)
>>>>> >>>>
>>>>> >>>> El 12 de abril de 2012 09:13, Manuel de la Peña <etil15 at gmail.com>
>>>>> escribió:
>>>>> >>>>
>>>>> >>>>>
>>>>> >>>>> On Apr 12, 2012 8:54 AM, "Vicente Ruiz" <vruiz2.0 at gmail.com>
>>>>> wrote:
>>>>> >>>>> >
>>>>> >>>>> > Hola Miguel Ángel,
>>>>> >>>>> >
>>>>> >>>>> > es una pregunta muy buena :) La verdad es que me ha costado un
>>>>> rato dar con el problema. Prueba cambiar esto:
>>>>> >>>>> >
>>>>> >>>>> > class EasyDict: --> class EasyDict(object):
>>>>> >>>>> >
>>>>> >>>>> > Esto se debe a que en las versiones anteriores a Python 3.x
>>>>> existen 2 tipos de clases: new-style y old-style. Esto desaparece en Python
>>>>> 3, siendo todas new-style. Puedes leer más sobre el tema aquí:
>>>>> http://docs.python.org/reference/datamodel.html#new-style-and-classic-classes
>>>>> >>>>> >
>>>>> >>>>> > Un saludo,
>>>>> >>>>> > Vicente Ruiz
>>>>> >>>>>
>>>>> >>>>> Buenas,
>>>>> >>>>>
>>>>> >>>>> Acá van mis 2c, la implementación no es totalmente correcta ya
>>>>> que tiene los siguientes fallos:
>>>>> >>>>>
>>>>> >>>>> 1. Estas devolviendo None cuando el valor no está en el dict.
>>>>> Esto rompe la interfaz de getattr, lo correcto sería lanzar la excepción
>>>>> AtributeError.
>>>>> >>>>> 2. No estas llamando al getattr del parental class cosa que es
>>>>> probablemente recomendable, yo haría algo como:
>>>>> >>>>>
>>>>> >>>>> def __getattr__(self, name):
>>>>> >>>>>     try:
>>>>> >>>>>         return super(Easydict, self).__geattr__(name)
>>>>> >>>>>     except AttributeError:
>>>>> >>>>>         if name in self.dict:
>>>>> >>>>>             return self.dict [name]
>>>>> >>>>>         raise AttributeError
>>>>> >>>>>
>>>>> >>>>> Creo recordar que si era un new class puedes usar super de está
>>>>> forma, pero no lo he probado por que estoy en el metro : P.
>>>>> >>>>>
>>>>> >>>>> Saludos
>>>>> >>>>>
>>>>> >>>>>
>>>>> >>>>> >
>>>>> >>>>> > El 12 de abril de 2012 08:25, Kiko <kikocorreoso at gmail.com>
>>>>> escribió:
>>>>> >>>>> >
>>>>> >>>>> >>
>>>>> >>>>> >>
>>>>> >>>>> >> El 12 de abril de 2012 07:58, Miguel Angel <
>>>>> miguelangel.garcia at gmail.com> escribió:
>>>>> >>>>> >>
>>>>> >>>>> >>> Hola!
>>>>> >>>>> >>>
>>>>> >>>>> >>> Tengo un problema y no sabía muy bien dónde preguntar... No
>>>>> sé si esta lista se utiliza sólo para las reuniones o las preguntas también
>>>>> tienen cabida.
>>>>> >>>>> >>
>>>>> >>>>> >>
>>>>> >>>>> >> A priori no hay ningún problema con las preguntas pero la
>>>>> finalidad de esta lista es un poco de organización de python-madrid, las
>>>>> quedadas y cosas así.
>>>>> >>>>> >>
>>>>> >>>>> >> Seguro que muchos de esta lista te podrán responder pero para
>>>>> el futuro es más adecuado que para las dudas técnicas de python acudas a:
>>>>> >>>>> >>
>>>>> >>>>> >>  -la lista python-es  (
>>>>> http://mail.python.org/mailman/listinfo/python-es).
>>>>> >>>>> >>  -a python.majibu (http://python.majibu.org/)
>>>>> >>>>> >>
>>>>> >>>>> >> Donde hay mucha más gente que en esta lista y cuyo objetivo
>>>>> es ese, resolver dudas técnicas
>>>>> >>>>> >>
>>>>> >>>>> >> Saludos.
>>>>> >>>>> >>
>>>>> >>>>> >> --
>>>>> >>>>> >> Grupo de usuarios de python ubicados en Madrid
>>>>> >>>>> >> http://groups.google.es/group/python-madrid
>>>>> >>>>> >> http://python-madrid.es
>>>>> >>>>> >> http://twitter.com/#!/python_madrid
>>>>> >>>>> >> Para darte de baja del grupo envía un mensaje a
>>>>> python-madrid+unsubscribe at googlegroups.com
>>>>> >>>>> >
>>>>> >>>>> >
>>>>> >>>>> >
>>>>> >>>>> >
>>>>> >>>>> > --
>>>>> >>>>> > Disponible en:
>>>>> >>>>> >
>>>>> >>>>> > http://www.vicenteruiz.es/
>>>>> >>>>> > http://www.menudoproblema.es/
>>>>> >>>>> > Twitter - LinkedIn
>>>>> >>>>> >
>>>>> >>>>> > --
>>>>> >>>>> > Grupo de usuarios de python ubicados en Madrid
>>>>> >>>>> > http://groups.google.es/group/python-madrid
>>>>> >>>>> > http://python-madrid.es
>>>>> >>>>> > http://twitter.com/#!/python_madrid
>>>>> >>>>> > Para darte de baja del grupo envía un mensaje a
>>>>> python-madrid+unsubscribe at googlegroups.com
>>>>> >>>>>
>>>>> >>>>> --
>>>>> >>>>> Grupo de usuarios de python ubicados en Madrid
>>>>> >>>>> http://groups.google.es/group/python-madrid
>>>>> >>>>> http://python-madrid.es
>>>>> >>>>> http://twitter.com/#!/python_madrid
>>>>> >>>>> Para darte de baja del grupo envía un mensaje a
>>>>> python-madrid+unsubscribe at googlegroups.com
>>>>> >>>>
>>>>> >>>>
>>>>> >>>>
>>>>> >>>>
>>>>> >>>> --
>>>>> >>>> Andrei Antoukh - <niwi at niwi.be>
>>>>> >>>> http://www.niwi.be/page/about/
>>>>> >>>> http://www.kaleidos.net/A5694F/
>>>>> >>>>
>>>>> >>>> "Linux is for people who hate Windows, BSD is for people who love
>>>>> UNIX"
>>>>> >>>> "Social Engineer -> Because there is no patch for human stupidity"
>>>>> >>>>
>>>>> >>>> --
>>>>> >>>> Grupo de usuarios de python ubicados en Madrid
>>>>> >>>> http://groups.google.es/group/python-madrid
>>>>> >>>> http://python-madrid.es
>>>>> >>>> http://twitter.com/#!/python_madrid
>>>>> >>>> Para darte de baja del grupo envía un mensaje a
>>>>> python-madrid+unsubscribe at googlegroups.com
>>>>> >>>
>>>>> >>>
>>>>> >>>
>>>>> >>>
>>>>> >>> --
>>>>> >>> Disponible en:
>>>>> >>>
>>>>> >>> http://www.vicenteruiz.es/
>>>>> >>> http://www.menudoproblema.es/
>>>>> >>> Twitter - LinkedIn
>>>>> >>>
>>>>> >>> --
>>>>> >>> Grupo de usuarios de python ubicados en Madrid
>>>>> >>> http://groups.google.es/group/python-madrid
>>>>> >>> http://python-madrid.es
>>>>> >>> http://twitter.com/#!/python_madrid
>>>>> >>> Para darte de baja del grupo envía un mensaje a
>>>>> python-madrid+unsubscribe at googlegroups.com
>>>>> >>
>>>>> >> --
>>>>> >> Grupo de usuarios de python ubicados en Madrid
>>>>> >> http://groups.google.es/group/python-madrid
>>>>> >> http://python-madrid.es
>>>>> >> http://twitter.com/#!/python_madrid
>>>>> >> Para darte de baja del grupo envía un mensaje a
>>>>> python-madrid+unsubscribe at googlegroups.com
>>>>> >
>>>>> >
>>>>> >
>>>>> >
>>>>> > --
>>>>> > Disponible en:
>>>>> >
>>>>> > http://www.vicenteruiz.es/
>>>>> > http://www.menudoproblema.es/
>>>>> > Twitter - LinkedIn
>>>>> >
>>>>> > --
>>>>> > Grupo de usuarios de python ubicados en Madrid
>>>>> > http://groups.google.es/group/python-madrid
>>>>> > http://python-madrid.es
>>>>> > http://twitter.com/#!/python_madrid
>>>>> > Para darte de baja del grupo envía un mensaje a
>>>>> python-madrid+unsubscribe at googlegroups.com
>>>>>
>>>>> --
>>>>> Grupo de usuarios de python ubicados en Madrid
>>>>> http://groups.google.es/group/python-madrid
>>>>> http://python-madrid.es
>>>>> http://twitter.com/#!/python_madrid
>>>>> Para darte de baja del grupo envía un mensaje a
>>>>> python-madrid+unsubscribe at googlegroups.com
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Andrei Antoukh - <niwi at niwi.be>
>>>> http://www.niwi.be/page/about/
>>>> http://www.kaleidos.net/A5694F/
>>>>
>>>> "Linux is for people who hate Windows, BSD is for people who love UNIX"
>>>> "Social Engineer -> Because there is no patch for human stupidity"
>>>>
>>>> --
>>>> Grupo de usuarios de python ubicados en Madrid
>>>> http://groups.google.es/group/python-madrid
>>>> http://python-madrid.es
>>>> http://twitter.com/#!/python_madrid
>>>> Para darte de baja del grupo envía un mensaje a
>>>> python-madrid+unsubscribe at googlegroups.com
>>>>
>>>  --
>>> Grupo de usuarios de python ubicados en Madrid
>>> http://groups.google.es/group/python-madrid
>>> http://python-madrid.es
>>> http://twitter.com/#!/python_madrid
>>> Para darte de baja del grupo envía un mensaje a
>>> python-madrid+unsubscribe at googlegroups.com
>>>
>>
>>
>>
>> --
>> Andrei Antoukh - <niwi at niwi.be>
>> http://www.niwi.be/page/about/
>> http://www.kaleidos.net/A5694F/
>>
>> "Linux is for people who hate Windows, BSD is for people who love UNIX"
>> "Social Engineer -> Because there is no patch for human stupidity"
>>
>> --
>> Grupo de usuarios de python ubicados en Madrid
>> http://groups.google.es/group/python-madrid
>> http://python-madrid.es
>> http://twitter.com/#!/python_madrid
>> Para darte de baja del grupo envía un mensaje a
>> python-madrid+unsubscribe at googlegroups.com
>>
>
>
>
> --
> *Disponible en:*
>
> http://www.vicenteruiz.es/
> http://www.menudoproblema.es/ <http://es.linkedin.com/in/alvarohurtado>
> Twitter <http://twitter.com/menudoproblema> - LinkedIn<http://es.linkedin.com/in/vicenteruiz>
>
>  --
> Grupo de usuarios de python ubicados en Madrid
> http://groups.google.es/group/python-madrid
> http://python-madrid.es
> http://twitter.com/#!/python_madrid
> Para darte de baja del grupo envía un mensaje a
> python-madrid+unsubscribe at googlegroups.com
>



-- 
Miguel Ángel García Martínez
http://www.magmax.org
Mail <miguelangel.garcia at gmail.com> | Twitter <http://twitter.com/#magmax9>
 | LinkedIn <http://www.linkedin.com/in/miguelangelgarciamartinez> |
about.me <http://about.me/miguelangelgarcia>

-- 
Grupo de usuarios de python ubicados en Madrid
http://groups.google.es/group/python-madrid
http://python-madrid.es
http://twitter.com/#!/python_madrid
Para darte de baja del grupo envía un mensaje a python-madrid+unsubscribe at googlegroups.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.es.python.org/pipermail/madrid/attachments/20120414/21df9ea7/attachment.html>


More information about the Madrid mailing list