加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 通过getattr动态获取dict元素?

发布时间:2020-12-16 22:19:57 所属栏目:Python 来源:网络整理
导读:我想动态查询我想要检索的类中的哪些对象. getattr看起来像我想要的,它对类中的顶级对象执行得很好.但是,我还想指定子元素. class MyObj(object): def __init__(self): self.d = {'a':1,'b':2} self.c = 3myobj = MyObj()val = getattr(myobj,"c")print val

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读