anyconfig.dicts

Utility functions to operate on mapping objects such as get, set and merge.

anyconfig.dicts.mk_nested_dic(path, val, seps=('/', '.'))

Make a nested dict iteratively.

Parameters
  • path – Path expression to make a nested dict

  • val – Value to set

  • seps – Separator char candidates

>>> mk_nested_dic("a.b.c", 1)
{'a': {'b': {'c': 1}}}
>>> mk_nested_dic("/a/b/c", 1)
{'a': {'b': {'c': 1}}}
anyconfig.dicts.get(dic, path, seps=('/', '.'), idx_reg=re.compile('(?:0|[1-9][0-9]*)'))

getter for nested dicts.

Parameters
  • dic – a dict[-like] object

  • path – Path expression to point object wanted

  • seps – Separator char candidates

Returns

A tuple of (result_object, error_message)

>>> d = {'a': {'b': {'c': 0, 'd': [1, 2]}}, '': 3}
>>> assert get(d, '/') == (3, '')  # key becomes '' (empty string).
>>> assert get(d, "/a/b/c") == (0, '')
>>> sorted(get(d, "a.b")[0].items())
[('c', 0), ('d', [1, 2])]
>>> (get(d, "a.b.d"), get(d, "/a/b/d/1"))
(([1, 2], ''), (2, ''))
>>> get(d, "a.b.key_not_exist")  # doctest: +ELLIPSIS
(None, "'...'")
>>> get(d, "/a/b/d/2")
(None, 'list index out of range')
>>> get(d, "/a/b/d/-")  # doctest: +ELLIPSIS
(None, 'list indices must be integers...')
anyconfig.dicts.set_(dic, path, val, seps=('/', '.'))

setter for nested dicts.

Parameters
  • dic – a dict[-like] object support recursive merge operations

  • path – Path expression to point object wanted

  • seps – Separator char candidates

>>> d = dict(a=1, b=dict(c=2, ))
>>> set_(d, 'a.b.d', 3)
>>> d['a']['b']['d']
3
anyconfig.dicts.merge(self, other, ac_merge='merge_dicts', **options)

Update (merge) a mapping object self with other mapping object or an iterable yields (key, value) tuples based on merge strategy ac_merge.

Parameters
  • others – a list of dict[-like] objects or (key, value) tuples

  • another – optional keyword arguments to update self more

  • ac_merge – Merge strategy to choose

anyconfig.dicts.convert_to(obj, ac_ordered=False, ac_dict=None, **options)

Convert a mapping objects to a dict or object of to_type recursively. Borrowed basic idea and implementation from bunch.unbunchify. (bunch is distributed under MIT license same as this.)

Parameters
  • obj – A mapping objects or other primitive object

  • ac_ordered – Use OrderedDict instead of dict to keep order of items

  • ac_dict – Callable to convert obj to mapping object

  • options – Optional keyword arguments.

Returns

A dict or OrderedDict or object of cls

>>> OD = anyconfig.compat.OrderedDict
>>> convert_to(OD((('a', 1) ,)), cls=dict)
{'a': 1}
>>> convert_to(OD((('a', OD((('b', OD((('c', 1), ))), ))), )), cls=dict)
{'a': {'b': {'c': 1}}}