通过getattr动态获取dict元素?

use*_*430 5 python dictionary getattr

我想动态查询我想要检索的类中的哪些对象.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
Run Code Online (Sandbox Code Playgroud)

如何通过字符串获取对象的字典元素?

kin*_*all 7

您收到错误的原因是getattr(myobj, "d['a']")查找d['a']对象上指定的属性,而不是一个.您的属性已命名d,它是一个字典.一旦您获得了对字典的引用,可以访问其中的项目.

mydict = getattr(myobj, "d")
val    = mydict["a"]
Run Code Online (Sandbox Code Playgroud)

或者正如其他人所示,你可以在一步中将它结合起来(我把它显示为两个以更好地说明实际发生的事情):

val = getattr(myobj, "d")["a"]
Run Code Online (Sandbox Code Playgroud)

您的问题暗示您认为对象中字典的项是对象的"子元素".但是,字典中的项与对象的属性不同.(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
Run Code Online (Sandbox Code Playgroud)

这里的基本思想是你采用一个路径,并且对于路径的每个组件,尝试在类似字典的容器中找到一个项目或者在一个对象上找到一个属性.当你到达路径的尽头时,返回你所拥有的.你的例子就是resolve(myobj, "d.a")


NPE*_*NPE 3

您只需使用方括号即可获取字典的元素:

val = getattr(myobj, "d")["a"]
Run Code Online (Sandbox Code Playgroud)

这将设置val1.