getattr nested attributes

Peter Otten __peter__ at web.de
Fri Aug 15 04:49:18 EDT 2008


Gregor Horvath wrote:

> Hi,
> 
> class A(object):
>      test = "test"
> 
> class B(object):
>      a = A()
> 
> 
> In [36]: B.a.test
> Out[36]: 'test'
> 
> In [37]: getattr(B, "a.test")
> ---------------------------------------------------------------------------
> <type 'exceptions.AttributeError'>        Traceback (most recent call
> last)
> 
> /<ipython console> in <module>()
> 
> <type 'exceptions.AttributeError'>: type object 'B' has no attribute
> 'a.test'
> 
> ???

I think that message is pretty clear. B doesn't have an attribute "a.test",
it has an attribute "a" which in turn has an attribute "test". You can
access it by calling getattr() twice,

>>> getattr(getattr(B, "a"), "test")
'test'

make your own function that loops over the attributes, or spell it

>>> reduce(getattr, "a.test".split("."), B)
'test'

> Documentation says B.a.test and getattr(B, "a.test") should be equivalent.
> 
> http://docs.python.org/lib/built-in-funcs.html

No, it doesn't.

Peter



More information about the Python-list mailing list