Skip to main content

Linked deep dictionaries in Python.

Project description

SigmaEpsilon.DeepDict

CircleCI codecov Documentation Status License PyPI Python 3.7‒3.10 Code style: black Requirements Status

A Lightweight Python library to manage nested dictionaries with parent-child relationships. On top of being a compatible drop-in replcement of the build in dict class, the self replicating default factory makes the creation of complex nested layouts effortless.

Documentation

The documentation is built with Sphinx using the PyData Sphinx Theme and hosted on ReadTheDocs.

Installation

This 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_name

Once the enviroment is created, activate it via typing

>>> .\venv_name\Scripts\activate

The library can be installed (either in a virtual enviroment or globally) from PyPI using pip on Python >= 3.7:

>>> pip install sigmaepsilon.deepdict

Usage

In every case where you'd want to use a dict, you can use a DeepDict as a drop-in replacement, but on top of what a simple dictionary provides, a DeepDict is more capable, as it provides a machinery to handle nested layouts. It is basically an ordered defaultdict with a self replicating default factory.

>>> from sigmaepsilon.deepdict import DeepDict
>>> data = DeepDict()

A DeepDict is 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'] = 2

Notice 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 a data, 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']
1

To 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']
3

Of 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 pure dict instance, we get

>>> [k for k in data.keys()]
['a']    

But if we use a DeepDict class and the option deep=True when accessing keys, values or items of dictionaries, the following happens:

>>> [k for k in DeepDict(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 the DeepDict only returns the leafs of the data-tree and the behaviour is fundamentally different:

>>> [k for k in data.values()]
[{'b': {'c': {'e': 3}, 'd': 2}}]    
>>> [k for k in DeepDict(data).values(deep=True)]
[3, 2]    

It is important, that the call obj.values(deep=True) still returns a generator object, which makes it memory efficient when looping over large datasets.

>>> DeepDict(data).values(deep=True)
<generator object OrderedDefaultDict.values at 0x0000028F209D54A0>    

Testing

To run all tests, open up a console in the root directory of the project and type the following

>>> python -m unittest

Dependencies

The only dependency is six, to provide basic continuity between major Python versions 2 and 3.

License

This package is licensed under the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sigmaepsilon.deepdict-1.1.0.tar.gz (26.7 kB view details)

Uploaded Source

Built Distribution

sigmaepsilon.deepdict-1.1.0-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

File details

Details for the file sigmaepsilon.deepdict-1.1.0.tar.gz.

File metadata

  • Download URL: sigmaepsilon.deepdict-1.1.0.tar.gz
  • Upload date:
  • Size: 26.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.13

File hashes

Hashes for sigmaepsilon.deepdict-1.1.0.tar.gz
Algorithm Hash digest
SHA256 a2191ecd564aa93cc0f077a10b0bdcadfa9d1c7bb4d554d11fd9b6093aa5ba03
MD5 339c687352356458f53ea2036b7e72a5
BLAKE2b-256 c2ab4ef6f0827fb4d396a58ca16645a38abb8177350a556674dd155247213ffd

See more details on using hashes here.

File details

Details for the file sigmaepsilon.deepdict-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for sigmaepsilon.deepdict-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d99150b8e92e71daf5b9bc2811d211d5f52c01db3307a2a2bc71012c16a0dd1c
MD5 1ad869cf2d9fceb63e86d2f5b831567e
BLAKE2b-256 90b5f49b8b1420a4b392963ccb3449a97ca19c2ae27b5ca7c357408da0f98817

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page