Причина, по которой вы получаете сообщение об ошибке, заключается в том, что getattr(myobj, "d['a']")
ищет атрибут с именем d['a']
на объекте, а его нет. Ваш атрибут называется d
, и это словарь. Если у вас есть ссылка на словарь, затем вы можете получить доступ к его элементам.
mydict = getattr(myobj, "d")
val = mydict["a"]
Или, как показали другие, вы можете объединить это за один шаг (я показал их как два, чтобы лучше проиллюстрировать, что на самом деле происходит):
val = getattr(myobj, "d")["a"]
Ваш вопрос подразумевает, что вы думаете, что элементы словаря в объекте являются «субэлементами» объекта. Однако элемент в словаре отличается от атрибута объекта. (Однако getattr()
не будет работать и с чем-то вроде o.a
; он просто получает один атрибут одного объекта. Если это тоже объект, и вы хотите получить один из его атрибутов, это другой getattr()
.)
Вы можете довольно легко написать функцию, которая проходит по пути атрибута (заданному в строке) и пытается разрешить каждое имя либо как ключ словаря, либо как атрибут:
def resolve(obj, attrspec):
for attr in attrspec.split("."):
try:
obj = obj[attr]
except (TypeError, KeyError):
obj = getattr(obj, attr)
return obj
Основная идея здесь заключается в том, что вы выбираете путь и для каждого компонента пути пытаетесь найти либо элемент в контейнере, похожем на словарь, либо атрибут объекта. Когда дойдете до конца пути, верните то, что у вас есть. Ваш пример будет resolve(myobj, "d.a")
person
kindall
schedule
01.02.2012
getattr(myobj, "d")['a']
сделал бы это, но я думаю, это не то, что вам нужно. - person Felix Kling   schedule 01.02.2012