Created
April 4, 2017 12:28
-
-
Save sergei-dyshel/faf8f300b2df94efa6a809428425fba7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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