如何将嵌套的 Python dict 转换为对象?

新手上路,请多包涵

我正在寻找一种优雅的方式来使用带有一些嵌套字典和列表的字典(即 javascript 样式的对象语法)的属性访问来获取数据。

例如:

 >>> d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}

应该可以通过这种方式访问:

 >>> x = dict2obj(d)
>>> x.a
1
>>> x.b.c
2
>>> x.d[1].foo
bar

我认为,如果没有递归,这是不可能的,但是获得 dicts 的对象样式的好方法是什么?

原文由 Marc 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

更新: 在 Python 2.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

原文由 Eli Bendersky 发布,翻译遵循 CC BY-SA 3.0 许可协议

令人惊讶的是,没有人提到 Bunch 。该库专门用于提供对 dict 对象的属性样式访问,并且完全按照 OP 的要求进行操作。演示:

 >>> from bunch import bunchify
>>> d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}
>>> x = bunchify(d)
>>> x.a
1
>>> x.b.c
2
>>> x.d[1].foo
'bar'

https://github.com/Infinidat/munch 提供了一个 Python 3 库—— 感谢 codyzu

 >>> from munch import DefaultMunch
>>> d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}
>>> obj = DefaultMunch.fromDict(d)
>>> obj.b.c
2
>>> obj.a
1
>>> obj.d[1].foo
'bar'

原文由 Arif Amirani 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题