Source code for decode.utils.types
from types import SimpleNamespace
from typing import Iterable
from copy import deepcopy
[docs]class RecursiveNamespace(SimpleNamespace):
"""
Extension of SimpleNamespace to recursive dictionaries.
Inspired by https://dev.to/taqkarim/extending-simplenamespace-for-nested-dictionaries-58e8
"""
[docs] @staticmethod
def map_entry(entry):
if isinstance(entry, dict):
return RecursiveNamespace(**entry)
return entry
def __init__(self, **kwargs):
super().__init__(**kwargs)
for key, val in kwargs.items():
if isinstance(val, dict):
setattr(self, key, RecursiveNamespace(**val))
elif isinstance(val, (tuple, list)):
setattr(self, key, list(map(self.map_entry, val)))
[docs] def to_dict(self):
d = deepcopy(self.__dict__) # should not be inplace, otherwise shitty
for k in d: # nice little recursion
if isinstance(d[k], RecursiveNamespace):
d[k] = d[k].to_dict()
return d
def __getitem__(self, item):
out = getattr(self, item)
if isinstance(out, RecursiveNamespace):
raise TypeError
return out
[docs] def keys(self):
return self.__dict__.keys()