Package: linkeddeepdict
LinkedDeepDictA Lightweight Python library to manage nested dictionaries with parent-child relationships.
On top of being a compatible drop-in replcement of the build indictclass, the self replicating default factory makes the creation of complex nested layouts effortless.DocumentationClickhereto read the documentation.InstallationThis is optional, but we suggest you to create a dedicated virtual enviroment at all times to avoid conflicts with your other projects. Create a folder, open a command shell in that folder and use the following command>>> python -m venv venv_nameOnce the enviroment is created, activate it via typing>>> .\venv_name\Scripts\activateThe library can be installed (either in a virtual enviroment or globally) from PyPI usingpipon Python >= 3.7:>>> pip install linkeddeepdictUsageIn every case where you'd want to use adict, you can use aLinkedDeepDictas a drop-in replacement, but on top of what a simple dictionary provides, aLinkedDeepDictis more capable, as it provides a machinery to handle nested layouts. It is basically an ordereddefaultdictwith a self replicating default factory.>>>fromlinkeddeepdictimportLinkedDeepDict>>>data=LinkedDeepDict()ALinkedDeepDictis essentially a nested default dictionary. Being nested refers to the fact that you can do this:>>>data['a']['b']['c']['e']=1>>>data['a']['b']['d']=2Notice that the object carves a way up until the last key, without needing to create each level explicitly. What happens is that every time a key is missing in adata, the object creates a new instance, which then is also ready to handle missing keys or data. Accessing nested subdictionaries works in a similar fashion:>>>data['a']['b']['c']['e']1To allow for a more Pythonic feel, it also supports array-like indexing, so that the following operations are valid:>>>data['a','b','c','e']=3>>>data['a','b','c','e']3Of course, this is something that we can easily replicate using pure Python in one line, without the need for fancy stuff:>>>data={'a':{'b':{'c':{'e':3},'d':2}}}The key point is that we loop over a puredictinstance, we get>>>[kforkindata.keys()]['a']But if we use aLinkedDeepDictclass and the optiondeep=Truewhen accessing
keys, values or items of dictionaries, the following happens:>>>[kforkinLinkedDeepDict(data).keys(deep=True)]['e','d']We can see, that in this case, iteration goes over keys, that actually hold on to some data, and does not return the containers themselves. If we do the same experiment with the values, it shows that theLinkedDeepDictonly returns the leafs of the data-tree and the behaviour is fundamentally different:>>>[kforkindata.values()][{'b':{'c':{'e':3},'d':2}}]>>>[kforkinLinkedDeepDict(data).values(deep=True)][3,2]It is important, that the callobj.values(deep=True)still returns a generator object, which makes it memory efficient when looping over large datasets.>>>LinkedDeepDict(data).values(deep=True)<generatorobjectOrderedDefaultDict.valuesat0x0000028F209D54A0>TestingTo run all tests, open up a console in the root directory of the project and type the following>>> python -m unittestDependenciesThe only dependency issix, to provide basic continuity between major Python versions 2 and 3.LicenseThis package is licensed under the MIT license.