Source code for ymp.helpers
"""
This module contains helper functions.
Not all of these are currently in use
"""
from collections import Mapping, OrderedDict
[docs]class OrderedDictMaker(object):
"""
odict creates OrderedDict objects in a dict-literal like syntax
>>> my_ordered_dict = odict[
>>> 'key': 'value'
>>> ]
Implementation:
odict uses the python slice syntax which is similar to dict literals.
The [] operator is implemented by overriding __getitem__. Slices
passed to the operator as ``object[start1:stop1:step1, start2:...]``,
are passed to the implementation as a list of objects with start, stop
and step members. odict simply creates an OrderedDictionary by iterating
over that list.
"""
def __getitem__(self, keys):
if isinstance(keys, slice):
return OrderedDict([(keys.start, keys.stop)])
return OrderedDict([(slice.start, slice.stop) for slice in keys])
odict = OrderedDictMaker() # pylint: disable=invalid-name
[docs]def update_dict(dst, src):
"""Recursively update dictionary ``dst`` with ``src``
- Treats a `list` as atomic, replacing it with new list.
- Dictionaries are overwritten by item
- None is replaced by empty dict if necessary
"""
if src is None:
return dst
for key, val in src.items():
if isinstance(val, Mapping):
dst_sub = dst.get(key, {})
if (dst_sub) is None:
dst_sub = {}
tmp = update_dict(dst_sub, val)
dst[key] = tmp
else:
dst[key] = src[key]
return dst