Convert nested Python dict to object?
Convert nested Python dict to object?
Update: In Python 2.6 and onwards, consider whether the namedtuple
data structure suits your needs:
>>> 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]
The alternative (original answer contents) is:
class Struct:
def __init__(self, **entries):
self.__dict__.update(entries)
Then, you can use:
>>> args = {a: 1, b: 2}
>>> s = Struct(**args)
>>> s
<__main__.Struct instance at 0x01D6A738>
>>> s.a
1
>>> s.b
2
Surprisingly no one has mentioned Bunch. This library is exclusively meant to provide attribute style access to dict objects and does exactly what the OP wants. A demonstration:
>>> 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
A Python 3 library is available at https://github.com/Infinidat/munch – Credit goes to 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
Convert nested Python dict to object?
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.c
2
>>> x.d[1].foo
bar