我正在寻找一种优雅的方式来使用带有一些嵌套字典和列表的字典(即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 对象样式的好方法?
更新: 在 Python 2.6 及更高版本中,请考虑namedtuple数据结构是否适合您的需求:
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