DotWiz is a blazing fast dict subclass that enables accessing (nested) keys in dot notation.
Project description
A blazing fast dict subclass that enables dot access notation via Python attribute style. Nested dict and list values are automatically transformed as well.
Documentation: https://dotwiz.readthedocs.io.
Assume you have a simple dict object, with dynamic keys:
>>> my_dict = {'this': {'dict': {'has': [{'nested': {'data': True}}]}}}
If the goal is to access a nested value, you could do it like this:
>>> my_dict['this']['dict']['has'][0]['nested']['data'] True
Or, using DotWiz:
>>> from dotwiz import DotWiz >>> dw = DotWiz(my_dict) >>> dw.this.dict.has[0].nested.data True
Note: This library can also make inaccessible keys safe – check out an example with DotWizPlus.
Install
$ pip install dotwiz
Usage
DotWiz
Here is an example of how to create and use a DotWiz object:
from dotwiz import DotWiz
dw = DotWiz({'this': {'works': {'for': [{'nested': {'values': True}}]}}},
the_answer_to_life=42)
print(dw)
# > ✫(this=✫(works=✫(for=[✫(nested=✫(values=True))])),
# the_answer_to_life=42)
assert dw.this.works['for'][0].nested.values # True
assert dw.the_answer_to_life == 42
print(dw.to_dict())
# > {'this': {'works': {'for': [{'nested': {'values': True}}]}},
# 'the_answer_to_life': 42}
Using make_dot_wiz allows you to pass in an iterable object when creating a DotWiz object:
from dotwiz import make_dot_wiz
dw = make_dot_wiz([('hello, world!', 123), ('easy: as~ pie?', True)],
AnyKey='value')
print(dw)
#> ✫(AnyKey='value', hello, world!=123, easy: as~ pie?=True)
assert dw['hello, world!'] == 123
assert dw['easy: as~ pie?']
assert dw.AnyKey == 'value'
DotWizPlus
DotWiz+ enables you to turn special-cased keys, such as names with spaces, into valid snake_case words in Python, as shown below. Also see the note on Issues with Invalid Characters below.
from dotwiz import DotWizPlus
my_dict = {'THIS': {'1': {'is': [{'For': {'AllOf': {'My !@ Fans!': True}}}]}}}
dw = DotWizPlus(my_dict)
print(dw)
#> ✪(this=✪(_1=✪(is_=[✪(for_=✪(all_of=✪(my_fans=True)))])))
# True
assert dw.this._1.is_[0].for_.all_of.my_fans
# alternatively, you can access it like a dict with the original keys:
assert dw['THIS']['1']['is'][0]['For']['AllOf']['My !@ Fans!']
print(dw.to_dict())
# {'THIS': {'1': {'is': [{'For': {'AllOf': {'My !@ Fans!': True}}}]}}}
print(dw.to_attr_dict())
# {'this': {'_1': {'is_': [{'for_': {'all_of': {'my_fans': True}}}]}}}
Issues with Invalid Characters
A key name in the scope of the DotWizPlus implementation must be:
a valid, lower- and snake- cased identifier in python.
not a reserved keyword, such as for or class.
not override dict method declarations, such as items, get, or values.
In the case where your key name does not conform, the library will mutate your key to a safe, snake-cased format.
Spaces and invalid characters are replaced with _. In the case of a key beginning with an int, a leading _ is added. In the case of a keyword or a dict method name, a trailing _ is added. Keys that appear in different cases, such as myKey or My-Key, will all be converted to a snake case variant, my_key in this example.
Finally, check out this example which brings home all that was discussed above.
Features
TODO
Benchmarks
Check out the Benchmarks section in the docs for more info.
Using a dot-access approach such as DotWiz can be up to 100x faster than with make_dataclass from the dataclasses module.
It’s also about 5x faster to create a DotWiz from a dict object as compared to other libraries such as prodict – or close to 15x faster than creating a Box – and up to 10x faster in general to access keys by dot notation – or almost 30x faster than accessing keys from a DotMap.
Contributing
Contributions are welcome! Open a pull request to fix a bug, or open an issue to discuss a new feature or change.
Check out the Contributing section in the docs for more info.
Credits
This package was created with Cookiecutter and the rnag/cookiecutter-pypackage project template.
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
Built Distribution
File details
Details for the file dotwiz-0.3.1.tar.gz
.
File metadata
- Download URL: dotwiz-0.3.1.tar.gz
- Upload date:
- Size: 23.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b5b4a2aeb122185325c5a88ee7407fc595ca2979fdfc78dacec62b8ed619fbda |
|
MD5 | a15c76eff1ddf2aed99ee2ef88c92d77 |
|
BLAKE2b-256 | 26e050a5ca3f3672299bae0da63145a9d7d9a2825235363bac4e90ac2eaa35d0 |
File details
Details for the file dotwiz-0.3.1-py2.py3-none-any.whl
.
File metadata
- Download URL: dotwiz-0.3.1-py2.py3-none-any.whl
- Upload date:
- Size: 13.2 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b10e0b0d2c641fcb9547885431f53f8fe0b42cab878b074a2bf52d85a6f18a3d |
|
MD5 | 280b1af734881dab40166358af5de60b |
|
BLAKE2b-256 | 776f88ffdea79371feeb39b5704ca72cc98a3d4c4e28a0e9a005944a5cab9224 |