The Python dictionary for humans dealing with evil/complex data.
Project description
python-benedict
The Python dictionary for humans dealing with evil/complex data.
Features
- Full keypath support (using the dot syntax by default)
- Many utility and parse methods to retrieve data as needed (all methods listed below)
- Give benediction :) to
dict
values before they are returned (they receive benedict casting) - Easy I/O operations with most common formats:
json
- 100% backward-compatible (you can replace existing dicts without pain)
Requirements
- Python 2.7, 3.4, 3.5, 3.6, 3.7
Installation
- Run
pip install python-benedict
Testing
- Run
tox
/python setup.py test
Usage
benedict
is a dict
subclass, so it is possible to use it as a normal dictionary (you can just cast an existing dict).
Import
from benedict import benedict
Init
Create a new instance:
d = benedict()
... or cast an existing dict
:
d = benedict(existing_dict)
If the existing dict keys contain the keypath separator a ValueError
will be raised.
In this case you should need to use a custom keypath separator.
Keypath
.
is the default keypath separator.
d = benedict()
# set values by keypath
d['profile.firstname'] = 'Fabio'
d['profile.lastname'] = 'Caccamo'
print(d) # -> { 'profile':{ 'firstname':'Fabio', 'lastname':'Caccamo' } }
print(d['profile']) # -> { 'firstname':'Fabio', 'lastname':'Caccamo' }
# check if keypath exists in dict
print('profile.lastname' in d) # -> True
# delete value by keypath
del d['profile.lastname']
Custom keypath separator
You can customize the keypath separator passing the keypath_separator
argument in the constructor.
d = benedict(existing_dict, keypath_separator='/')
API
Keypath methods
-
keypaths
# Return a list of all keypaths in the dict.
d.keypaths()
I/O methods
These methods simplify I/O operations with most common formats: json
-
from_json
# Try to load/decode a json and return it as dict.
# Accept as first argument: url, filepath or string.
# A ValueError is raised in case of failure.
# Return a dict instance.
benedict.from_json(s)
-
to_json
# Encode the current dict in json format and optionally save it at filepath.
# It's possible to pass custom options to the encoder using kwargs, eg. sort_keys=True.
# A ValueError is raised in case of failure.
# Return the current dict encoded in json format.
s = d.to_json(filepath='', **kwargs)
Utility methods
These methods are common utilities that will speed up your everyday work.
-
clean
# Clean the current dict removing all empty values: None, '', {}, [], ().
# If strings, dicts or lists flags are False, related empty values will not be deleted.
d.clean(strings=True, dicts=True, lists=True)
-
clone
# Return a clone (deepcopy) of the dict.
d.clone()
-
dump
# Return a readable representation of any dict/list.
# This method can be used both as static method or instance method.
s = benedict.dump(d.keypaths())
print(s)
# or
d = benedict()
print(d.dump())
-
filter
# Return a filtered dict using the given predicate function.
# Predicate function receives key, value arguments and should return a bool value.
predicate = lambda k, v: v is not None
d.filter(predicate)
-
merge
# Merge one or more dictionary objects into current instance (deepupdate).
# Sub-dictionaries keys will be merged toghether.
d.merge(a, b, c)
-
remove
# Remove multiple keys from the dict.
d.remove(['firstname', 'lastname', 'email'])
-
subset
# Return a dict subset for the given keys.
d.subset(['firstname', 'lastname', 'email'])
Parse methods
These methods are wrappers of the get
method, they parse data trying to return it in the expected type.
-
get_bool
# Get value by key or keypath trying to return it as bool.
# Values like `1`, `true`, `yes`, `on`, `ok` will be returned as `True`.
d.get_bool(key, default=False)
-
get_bool_list
# Get value by key or keypath trying to return it as list of bool values.
# If separator is specified and value is a string it will be splitted.
d.get_bool_list(key, default=[], separator=',')
-
get_datetime
# Get value by key or keypath trying to return it as datetime.
# If format is not specified it will be autodetected.
# If options and value is in options return value otherwise default.
d.get_datetime(key, default=None, format=None, options=[])
-
get_datetime_list
# Get value by key or keypath trying to return it as list of datetime values.
# If separator is specified and value is a string it will be splitted.
d.get_datetime_list(key, default=[], format=None, separator=',')
-
get_decimal
# Get value by key or keypath trying to return it as Decimal.
# If options and value is in options return value otherwise default.
d.get_decimal(key, default=Decimal('0.0'), options=[])
-
get_decimal_list
# Get value by key or keypath trying to return it as list of Decimal values.
# If separator is specified and value is a string it will be splitted.
d.get_decimal_list(key, default=[], separator=',')
-
get_dict
# Get value by key or keypath trying to return it as dict.
# If value is a json string it will be automatically decoded.
d.get_dict(key, default={})
-
get_email
# Get email by key or keypath and return it.
# If value is blacklisted it will be automatically ignored.
# If check_blacklist is False, it will be not ignored even if blacklisted.
d.get_email(key, default='', options=None, check_blacklist=True)
-
get_float
# Get value by key or keypath trying to return it as float.
# If options and value is in options return value otherwise default.
d.get_float(key, default=0.0, options=[])
-
get_float_list
# Get value by key or keypath trying to return it as list of float values.
# If separator is specified and value is a string it will be splitted.
d.get_float_list(key, default=[], separator=',')
-
get_int
# Get value by key or keypath trying to return it as int.
# If options and value is in options return value otherwise default.
d.get_int(key, default=0, options=[])
-
get_int_list
# Get value by key or keypath trying to return it as list of int values.
# If separator is specified and value is a string it will be splitted.
d.get_int_list(key, default=[], separator=',')
-
get_list
# Get value by key or keypath trying to return it as list.
# If separator is specified and value is a string it will be splitted.
d.get_list(key, default=[], separator=',')
-
get_list_item
# Get list by key or keypath and return value at the specified index.
# If separator is specified and list value is a string it will be splitted.
d.get_list_item(key, index=0, default=None, separator=',')
-
get_phonenumber
# Get phone number by key or keypath and return a dict with different formats (e164, international, national).
# If country code is specified (alpha 2 code), it will be used to parse phone number correctly.
d.get_phonenumber(key, country_code=None, default=None)
-
get_slug
# Get value by key or keypath trying to return it as slug.
# If options and value is in options return value otherwise default.
d.get_slug(key, default='', options=[])
-
get_slug_list
# Get value by key or keypath trying to return it as list of slug values.
# If separator is specified and value is a string it will be splitted.
d.get_slug_list(key, default=[], separator=',')
-
get_str
# Get value by key or keypath trying to return it as string.
# Encoding issues will be automatically fixed.
# If options and value is in options return value otherwise default.
d.get_str(key, default='', options=[])
-
get_str_list
# Get value by key or keypath trying to return it as list of str values.
# If separator is specified and value is a string it will be splitted.
d.get_str_list(key, default=[], separator=',')
Django
benedict
could be very useful in django
views too:
params = benedict(request.GET.items())
License
Released under MIT License.
Project details
Release history Release notifications | RSS feed
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 python-benedict-0.6.0.tar.gz
.
File metadata
- Download URL: python-benedict-0.6.0.tar.gz
- Upload date:
- Size: 11.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.6.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
90f581c1a56d099af3ba5b641148de9551d8750113fce9a54b22eef8c19f5880
|
|
MD5 |
9c71125026617c32cda2f39950da3c67
|
|
BLAKE2b-256 |
cb1ee3d986364b3ccb7d0ed79aa9bad4e6fef12ac5cacc97c504215512fb59b5
|
File details
Details for the file python_benedict-0.6.0-py2-none-any.whl
.
File metadata
- Download URL: python_benedict-0.6.0-py2-none-any.whl
- Upload date:
- Size: 13.9 kB
- Tags: Python 2
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.6.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
af57eb164ea9ea8c66cfa0ba79dc3a18ce779df1615c9c84e67ba39c01234f75
|
|
MD5 |
c033d3e93ebf49c554c6cf2332cda337
|
|
BLAKE2b-256 |
c4d125e46825eec5533086f4220286ca77af29672ce8da5dd89a66fb3de4babb
|