問題

我正在尋找一種優雅的方法來使用帶有一些巢狀dicts和列表的dict上的屬性訪問獲取資料(即javascript-style物件語法).

例如:

 >>> 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物件樣式的好方法是什麼?

  最佳答案

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

  相同標籤的其他問題

pythonobjectdictionary