class dotdictify(dict): marker = object() 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 isinstance(value, dict) and not isinstance(value, dotdictify): value = dotdictify(value) dict.__setitem__(self, key, value) def __getitem__(self, key): found = self.get(key, dotdictify.marker) if found is dotdictify.marker: found = dotdictify() dict.__setitem__(self, key, found) return found __setattr__ = __setitem__ __getattr__ = __getitem__
Now we can use '.' rather than having to use standard ['key'] syntax: eg:
life = {'bigBang' : {'stars': {'planets': {} }}} life = dotdictify(life) print life.bigBang.stars.planets instead of: print life['bigBang']['stars']['planets'] life.bigBang.stars.planets.earth = { 'singleCellLife' : {} } print life.bigBang.stars.planets
Ok, so it's just syntax candy, but does makes things easier to read in code.