Last active
December 23, 2015 04:48
Revisions
-
copitux revised this gist
Sep 17, 2013 . 1 changed file with 6 additions and 1 deletion.There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -43,7 +43,12 @@ def __getitem__(self, key): 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: -
copitux created this gist
Sep 16, 2013 .There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,52 @@ 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 __getattr__ = __getitem__ def get(self, key, default=None): try: return self[key] except: return default