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

  • 问题:
  • 我正在寻找一种优雅的方式来获取数据,在dict上使用一些嵌套的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获得对象样式呢?在

  • 答案:
  • 更新:在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