Python - getattr и конкатенация
Итак, поиграв с getattr в моем коде, я обнаружил следующее:
myVariable = foo.A.bar
работает... но как то так:
B = "A"
myVariable = getattr(foo, B + ".bar")
возвращает ошибку, что foo не содержит атрибут A.bar. Куда я иду не так? Спасибо!
2 ответа
Решение
Потому что нет атрибута A.bar
на foo
, атрибут bar
является частью объекта, на который указывает A
, который является атрибутом foo
, Вам нужно либо
getattr(foo.A, "bar")
или же
getattr(getattr(foo, 'A'), 'bar')
Общий код для доступа к глубоким атрибутам состоит в том, чтобы разбить точку и идти до тех пор, пока не будет найдена последняя часть (я пишу из памяти, не проверял):
def getattr_deep(start, attr):
obj = start
for part in attr.split('.'):
obj = getattr(obj, part)
return obj
getattr_deep(foo, 'A.bar')
Эквивалент:
myVariable = foo.A.bar
использование getattr займет 2 шага.
aObject = getattr(foo, 'A')
myVariable = getattr(aobject, 'bar')
делать это по-своему `myVariable = getattr(foo, B + ".bar") означает" myVariable = getattr(foo, "B.bar") "getAttr теперь ищет строку" B.bar ", которая, очевидно, не существует.