Skip to content

Instantly share code, notes, and snippets.

@zackshen
Created October 10, 2014 09:58
Show Gist options
  • Select an option

  • Save zackshen/6f6f52445b56f89034bc to your computer and use it in GitHub Desktop.

Select an option

Save zackshen/6f6f52445b56f89034bc to your computer and use it in GitHub Desktop.

Revisions

  1. zackshen created this gist Oct 10, 2014.
    68 changes: 68 additions & 0 deletions dotdictfy.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,68 @@
    class dotdictify(dict):
    def __init__(self, value=None):
    if value is None:
    pass
    elif isinstance(value, dict):
    for key in value:
    self.__setitem__(key, value[key])
    else:
    raise TypeError, 'expected dict'

    def __setitem__(self, key, value):
    if key is not None and '.' in key:
    myKey, restOfKey = key.split('.', 1)
    target = self.setdefault(myKey, dotdictify())
    if not isinstance(target, dotdictify):
    raise KeyError, 'cannot set "%s" in "%s" (%s)' % (restOfKey, myKey, repr(target))
    target[restOfKey] = value
    else:
    if isinstance(value, dict) and not isinstance(value, dotdictify):
    value = dotdictify(value)
    dict.__setitem__(self, key, value)

    def __getitem__(self, key):
    if key is None or '.' not in key:
    return dict.__getitem__(self, key)
    myKey, restOfKey = key.split('.', 1)
    target = dict.__getitem__(self, myKey)
    if not isinstance(target, dotdictify):
    raise KeyError, 'cannot get "%s" in "%s" (%s)' % (restOfKey, myKey, repr(target))
    return target[restOfKey]

    def __contains__(self, key):
    if key is None or '.' not in key:
    return dict.__contains__(self, key)
    myKey, restOfKey = key.split('.', 1)
    if not dict.__contains__(self, myKey):
    return False
    target = dict.__getitem__(self, myKey)
    if not isinstance(target, dotdictify):
    return False
    return restOfKey in target

    def setdefault(self, key, default):
    if key not in self:
    self[key] = default
    return self[key]

    def get(self, k, d=None):
    if dotdictify.__contains__(self, k):
    return dotdictify.__getitem__(self, k)
    return d

    __setattr__ = __setitem__
    __getattr__ = __getitem__



    if __name__ == '__main__':
    obj = {
    'a': {
    'b': {
    'c': 2
    }
    }
    }

    d = dotdictify(obj)
    print d.get('a.b.c')