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 ", которая, очевидно, не существует.

Другие вопросы по тегам