Skip to content

Instantly share code, notes, and snippets.

@copitux
Last active December 23, 2015 04:48
Show Gist options
  • Save copitux/6582302 to your computer and use it in GitHub Desktop.
Save copitux/6582302 to your computer and use it in GitHub Desktop.
DotNestedDict
class DotNestedDict(dict):
"""
Working with nested dicts (common with mongodb resources) in
a easy way
nested = DotNestedDict({
'lvl1': {'lvl2': {'lvl3': 'here'}},
'collection': [0, 1, 2, 3, {'nested': 4}],
})
assert nested['lvl1.lvl2.lvl3'] == 'here'
assert nested.get('lvl1.lvl2.lvl3') == 'here'
assert nested['collection.4.nested'] == 4
# Errors
assertRaises nested['lvl1.lvl2.fake'] == KeyError('fake')
assert nested.get('lvl1.lvl2.fake', 3) == 3
TODO: doc as doctest
"""
def _intize(self, key):
try:
return int(key)
except ValueError:
return key
def __getitem__(self, key):
orig_get = super(DotNestedDict, self).__getitem__
try:
return orig_get(key)
except KeyError:
if not isinstance(key, basestring):
raise
bits = filter(bool, key.split('.'))
current = orig_get(bits[0])
for bit in bits[1:]:
try:
bit = self._intize(bit)
current = current.__getitem__(bit)
except AttributeError:
raise KeyError('%s' % bit)
return current
def __getattr__(self, key):
try:
return self.__getitem__(key)
except KeyError as e:
raise AttributeError(e)
def get(self, key, default=None):
try:
return self[key]
except:
return default
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment