Source code for warg.data_structures.auto_dict
#!/usr/bin/env python3
__author__ = "Christian Heider Lindbjerg"
__doc__ = r"""
Created on 21/12/2019
"""
import logging
from collections import defaultdict
from typing import Callable, Dict, Mapping, Optional
_logger = logging.getLogger(__name__)
__all__ = [
"AutoDict",
"autodict",
"AD",
"sanitise_auto_dict",
"recursive_default_dict_print",
"recursive_default_dict",
]
[docs]
def AutoDict() -> defaultdict:
"""
:return: Returns a defaultdict of autodict factory
:rtype: defaultdict
"""
return defaultdict(autodict)
[docs]
def sanitise_auto_dict(d: Dict) -> Optional[Dict]:
"""
:param d:
:type d:
:return:
:rtype:"""
if isinstance(d, defaultdict):
if len(d.keys()) == 0:
return
out_dict = {}
for k, v in d.items():
if isinstance(v, defaultdict):
sanitised = sanitise_auto_dict(v)
if sanitised is None:
continue
out_dict[k] = sanitised
else:
out_dict[k] = v
if len(out_dict) > 0:
return out_dict
return
autodict = AutoDict
AD = AutoDict
[docs]
def recursive_default_dict() -> defaultdict:
return defaultdict(recursive_default_dict)
[docs]
def recursive_default_dict_print(d: Mapping, depth: int = 1, printer: Callable = print) -> None:
"""
:param printer:
:param d:
:type d:
:param depth:
:type depth:
"""
for k, v in d.items():
printer("-" * depth, k)
if type(v) is defaultdict:
recursive_default_dict_print(v, depth + 1)
else:
printer("-" * (depth + 1), v)
if __name__ == "__main__":
ad = AutoDict()
a = ad["b"]["b"]["b"]["b"]
ad["b"]["b"]["c"]["b"]["c"] = {}
ad["c"] = 1
ad["cd"]["v"] = 1
ad["qc"]["d"] = []
ad["cf"]["b6"] = None
ad["cf"]["1"] = None
_logger.info(ad)
recursive_default_dict_print(ad)
_logger.info(sanitise_auto_dict(ad))