getattr nested attributes

Paul Boddie paul at
Fri Aug 15 15:42:26 CEST 2008

On 15 Aug, 10:35, Gregor Horvath <g... at> wrote:
> <type 'exceptions.AttributeError'>: type object 'B' has no attribute
> 'a.test'

You have to realise that attributes can have names beyond those
supported by the usual attribute access syntax. For example:

  class C: pass

  setattr(C, "x.y", 123)
  getattr(C, "x.y")            # gives 123
  setattr(C, "class $$$", 456)
  getattr(C, "class $$$")      # gives 456

Note that there's no way of using the syntax to access
these attributes, although some proposals have been made to allow it
in some fashion. What you should conclude from this is that the name
argument to setattr and getattr is just a name, not an expression,
even if you can construct names which look like expressions or other
syntactically meaningful fragments of code.

> Documentation says B.a.test and getattr(B, "a.test") should be equivalent.

No, the documentation says that the name must be "the name of one of
the object's attributes", not an expression fragment that if combined
with the name of the object and evaluated would yield an attribute
from some object or other reachable via the original object.


More information about the Python-list mailing list