为了账号安全,请及时绑定邮箱和手机立即绑定

将嵌套的Pythondict转换为对象?

将嵌套的Pythondict转换为对象?

交互式爱情 2019-08-03 07:03:51
将嵌套的Pythondict转换为对象?我正在寻找一种优雅的方法来使用属性访问DECT来获取数据,其中包含一些嵌套的DECTS和列表(即javascript样式的对象语法)。例如:>>> d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}应以这种方式获得:>>> x = dict2obj(d)>>> x.a1>>> x.b.c2>>> x.d[1].foo bar我认为,如果没有递归,这是不可能的,但是有什么好的方法来获得DECTS的对象样式呢?
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

在Python2.6和更高版本中,请考虑namedtuple数据结构适合您的需要:

>>> from collections import namedtuple

>>> MyStruct = namedtuple('MyStruct', 'a b d')

>>> s = MyStruct(a=1, b={'c': 2}, d=['hi'])

>>> s

MyStruct(a=1, b={'c': 2}, d=['hi'])

>>> s.a

1

>>> s.b

{'c': 2}

>>> s.c

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'MyStruct' object has no attribute 'c'

>>> s.d

['hi']

备选方案(最初的答复内容)是:


class Struct:

    def __init__(self, **entries):

        self.__dict__.update(entries)

然后,您可以使用:


>>> args = {'a': 1, 'b': 2}

>>> s = Struct(**args)

>>> s

<__main__.Struct instance at 0x01D6A738>

>>> s.a

1

>>> s.b

2




查看完整回答
反对 回复 2019-08-05
?
largeQ

TA贡献2039条经验 获得超7个赞

class obj(object):
    def __init__(self, d):
        for a, b in d.items():
            if isinstance(b, (list, tuple)):
               setattr(self, a, [obj(x) if isinstance(x, dict) else x for x in b])
            else:
setattr(self, a, obj(b) if isinstance(b, dict) else b)>>> d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}>>> x = obj(d)>>>
 x.b.c2>>> x.d[1].foo'bar'




查看完整回答
反对 回复 2019-08-05
  • 3 回答
  • 0 关注
  • 386 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信