我想动态查询我要检索的类中的哪些对象。 getattr 看起来像我想要的,它对于该类中的顶级对象表现良好。但是,我还要指定子元素。
class MyObj(object):
def __init__(self):
self.d = {'a':1, 'b':2}
self.c = 3
myobj = MyObj()
val = getattr(myobj, "c")
print val # Correctly prints 3
val = getattr(myobj, "d['a']") # Seemingly incorrectly formatted query
print val # Throws an AttributeError
如何通过字符串获取对象的字典元素?
最佳答案
出现错误的原因是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")
关于python - 通过getattr动态获取dict元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9101072/