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

Leave a Reply

Your email address will not be published.