📘 dict subclass with keylist/keypath support, built-in I/O operations (base64, csv, ini, json, pickle, plist, query-string, toml, xls, xml, yaml), s3 support and many utilities.
Go to file
Fabio Caccamo 85dc3e6c5b Updated README. [ci skip] 2019-07-10 14:36:51 +02:00
benedict Added timestamp support to get_datetime parse method. 2019-07-09 18:04:22 +02:00
tests Fixed get_datetime method from timestamp tests. 2019-07-09 18:36:19 +02:00
.gitignore Added src. 2019-05-17 13:13:15 +02:00
.travis.yml Updated .travis.yml 2019-07-02 15:38:18 +02:00
CHANGELOG.md Updated version, CHANGELOG and README. 2019-07-09 16:04:36 +02:00
LICENSE.txt Added src. 2019-05-17 13:13:15 +02:00
MANIFEST.in Added src. 2019-05-17 13:13:15 +02:00
README.md Updated README. [ci skip] 2019-07-10 14:36:51 +02:00
setup.cfg Added src. 2019-05-17 13:13:15 +02:00
setup.py Updated README and setup.py keywords. [ci skip] 2019-07-10 12:01:46 +02:00
tox.ini Fixed `setup.py` requirements installation on Python 2.7. 2019-06-11 18:40:46 +02:00

README.md

Build Status codecov Codacy Badge Scrutinizer Code Quality Requirements Status PyPI version PyPI downloads Py versions License

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)
  • 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()

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)
  • deepcopy
# Return a deepcopy of the dict.
d.deepcopy()
  • dump
# Return a readable representation of any dict/list.
s = benedict.dump(d.keypaths())
print(s)
  • dump_items
# Return a readable representation of the dict for the given key (optional).
s = d.dump_items(key=None)
print(s)
  • 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)

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=',')

License

Released under MIT License.