[python-madrid] Problema con __getattr__

Miguel Angel miguelangel.garcia at gmail.com
Thu Apr 12 07:58:26 CEST 2012


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. De todas maneras, creo que la concentración de programadores python
por "mail cuadrado" es alta y seguro que alguien me puede echar una mano.

Es un problema tontísimo.

Aunque no es importante, pero por dar contexto, estoy usando ConfigParser
para leer un archivo, pero no me gusta acceder a las propiedades de la
manera:

config.get('section', 'option')

Sino que quiero acceder de la forma:

config.section.option


Para ello me crearé una función que convierta los ConfigParser a una
estructura que usa la clase:

class EasyDict:
    def __init__(self):
        self._values = {}

    def add(self, k, v):
        self._values[k] = v

    def __getattr__(self, k):
        return self._values.get(k, None)

    def __str__(self):
        return str(self._values)


Me he puesto a probar la clase y me encuentro con un problema absurdo.
Publico sólo dos tests:

class TestEasyDict(unittest.TestCase):
    def setUp(self):
        self.sut = EasyDict()

    def test_add_object(self):
        self.sut.add('a', [])
        self.assertEquals([], self.sut.a)


    def test_add_dict(self):
        item = EasyDict()
        self.sut.add('c', item)

        self.assertTrue(self.sut)
        self.assertEquals(item, self.sut.c)


Podéis observar que son dos tests idénticos, salvo que el primero guarda un
array y el segundo, otro objeto de tipo EasyDict. Bueno, pues el resultado
es que no existe "self.sut" en el assertTrue (que añadí porque el
assertEquals también cascaba, claro):

$ nosetests tests
E.
======================================================================
ERROR: test_add_dict (main_tests.TestEasyDict)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "main_tests.py", line 30, in test_add_dict
    self.assertTrue(self.sut)
  File "/usr/lib/python2.7/unittest/case.py", line 418, in assertTrue
    if not expr:
TypeError: 'NoneType' object is not callable

----------------------------------------------------------------------
Ran 2 tests in 0.006s

FAILED (errors=1)
$

¿Alguien le encuentra algún sentido a esto? ¿sabríais decirme cómo
arreglarlo?

Un saludo y gracias!

-- 
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/20120412/bb268353/attachment.html>


More information about the Madrid mailing list