Skip to content

Instantly share code, notes, and snippets.

@copitux
Last active December 23, 2015 04:48

Revisions

  1. copitux revised this gist Sep 17, 2013. 1 changed file with 6 additions and 1 deletion.
    7 changes: 6 additions & 1 deletion datastructures.py
    Original file line number Diff line number Diff line change
    @@ -43,7 +43,12 @@ def __getitem__(self, key):
    raise KeyError('%s' % bit)

    return current
    __getattr__ = __getitem__

    def __getattr__(self, key):
    try:
    return self.__getitem__(key)
    except KeyError as e:
    raise AttributeError(e)

    def get(self, key, default=None):
    try:
  2. copitux created this gist Sep 16, 2013.
    52 changes: 52 additions & 0 deletions datastructures.py
    Original 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