将嵌套的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个赞
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
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'
添加回答
举报
0/150
提交
取消