Skip to content

Instantly share code, notes, and snippets.

@sergei-dyshel
Created April 4, 2017 12:28
Show Gist options
  • Save sergei-dyshel/faf8f300b2df94efa6a809428425fba7 to your computer and use it in GitHub Desktop.
Save sergei-dyshel/faf8f300b2df94efa6a809428425fba7 to your computer and use it in GitHub Desktop.
class MultiDict(UserDict.DictMixin):
def __init__(self, data={}):
self._data = data
def _recursive_get(self, data, keys):
if not keys:
return data
return self._recursive_get(data[keys[0]], keys[1:])
def __getitem__(self, keys):
assert keys
return self._recursive_get(self._data, keys)
def _recursive_set(self, data, keys, value):
assert keys
key = keys[0]
if len(keys) == 1:
data[key] = value
return
if keys[0] not in data:
x = {}
data[key] = x
return self._recursive_set(data[key], keys[1:], value)
def __setitem__(self, keys, value):
assert keys
self._recursive_set(self._data, keys, value)
def _recursive_del(self, data, keys):
assert keys
key = keys[0]
if len(keys) == 1:
del data[key]
return
subdata = data[key]
self._recursive_del(subdata, keys[1:])
if not subdata:
del data[key]
def __delitem__(self, keys):
assert keys
self._recursive_del(self._data, keys)
def keys(self):
return self._data.keys()
def __str__(self):
return str(self._data)
def __repr__(self):
return 'MultiDict({})'.format(repr(self._data))
def dict(self):
return self._data
def _pprint(self, data, level, indent, depth, stream):
def print_on_level(s):
stream.write('{}{}\n'.format(' ' * level * indent, s))
if isinstance(data, dict) and not depth == 0:
for key, value in data.iteritems():
print_on_level(str(key) + ':')
self._pprint(
value,
level=level + 1,
indent=indent,
depth=depth - 1,
stream=stream)
else:
print_on_level(data)
def pprint(self, indent=8, depth=-1, stream=sys.stdout):
self._pprint(self._data, 0, indent=indent, depth=depth, stream=stream)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment