Here a general function to transform a nested dictionary to a nested namedtuple
from collections import namedtuple
def dict2namedtuple(name, d):
values, keys = [], []
for k in d:
keys.append(k)
v = d[k]
if isinstance(v, dict):
values.append(dict2namedtuple(k, v))
else:
values.append(v)
T = namedtuple(name, keys)
return T(*values)
def namedtuple2dict(nt):
d = {}
for k in nt._fields:
v = getattr(nt, k)
try:
d[k] = namedtuple2dict(v)
except AttributeError:
d[k] = v
return d
test_dict = {'a': 1, 'b': 2, 'c': {'d': 3, 'e': 4}}
nt = dict2namedtuple('test', d=test_dict)
dc = namedtuple2dict(nt)
assert dc == test_dict
print('namedtuple', nt)
print('dict', dc)
EDIT:
I added a function for the inverse problem namedtuple2dict
. In my experience namedtuple._asidct()
works fine, but @Chev_603 mentioned some problems.