Creo que la confusión surge del hecho de que la notación de punto recto (ex a.b.c
) tiene los mismos parámetros que getattr()
, pero la lógica de análisis es diferente. Si bien ambos son esenciales para el atributo __dict__
de un objeto, getattr()
no está sujeto a los requisitos más estrictos sobre los atributos accesibles por punto. Por ejemplo
setattr(foo, 'Big fat ugly string. But you can hash it.', 2)
es válida, ya que la cadena sólo se convierte en una clave hash en foo.__dict__
, pero
foo.Big fat ugly string. But you can hash it. = 2
y
foo.'Big fat ugly string. But you can hash it.' = 2
son errores de sintaxis, porque ahora se está pidiendo que el intérprete analizar estas cosas como código sin formato, y eso no funciona.
La otra cara de esto es que mientras foo.b.c
es equivalente a foo.__dict__['b'].__dict__['c']
, getattr(foo, 'b.c')
es equivalente a foo.__dict__['b.c']
. Es por eso que getattr
no funciona como esperaba.
Ahora hacer esto: 'setattr (a, 'b.c', 2')'. ¿Qué debería 'getattr (a,' b.c ') 'devolver ahora? ¿Qué pasaría si no hubiera 'c' en' b' antes? Puede usar un '.' en los nombres de los atributos, por lo que no puede esperar que' getattr' pueda atravesar objetos como este. –