Source code for toolbox.collections.namedtuple
from collections import namedtuple
from collections.abc import Mapping
[docs]
def nestednamedtuple(dictionary: dict) -> namedtuple:
"""Converts dictionary to a nested namedtuple recursively.
Args:
dictionary: Dictionary to convert into a nested namedtuple.
Example:
.. code-block:: python
from toolbox.collections.namedtuple import nestednamedtuple
nt = nestednamedtuple({"hello": {"ola": "mundo"}})
print(nt) # >>> namedtupled(hello=namedtupled(ola='mundo'))
"""
if isinstance(dictionary, Mapping) and not isinstance(dictionary, fdict):
for key, value in list(dictionary.items()):
dictionary[key] = nestednamedtuple(value)
return namedtuple("namedtupled", dictionary)(**dictionary)
elif isinstance(dictionary, list):
return [nestednamedtuple(item) for item in dictionary]
return dictionary
[docs]
class fdict(dict):
"""Forced dictionary. Prevents dictionary from becoming a nested namedtuple.
Example:
.. code-block:: python
from toolbox.collections.namedtuple import nestednamedtuple, fdict
d = {"hello": "world"}
nt = nestednamedtuple({"forced": fdict(d), "notforced": d})
print(nt.notforced) # >>> namedtupled(hello='world')
print(nt.forced) # >>> {'hello': 'world'}
"""