我想动态查询我要检索的类中的哪些对象。 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/

10-12 14:14