import UserDict class Chainmap(UserDict.DictMixin): """Combine multiple mappings for sequential lookup. For example, to emulate Python's normal lookup sequence: import __builtin__ pylookup = Chainmap(locals(), globals(), vars(__builtin__)) """ def __init__(self, *maps): self._maps = maps def __getitem__(self, key): for mapping in self._maps: try: return mapping[key] except KeyError: pass raise KeyError(key) if __name__ == "__main__": d1 = {'a':1, 'b':2} d2 = {'a':3, 'd':4} cm = Chainmap(d1, d2) assert cm['a'] == 1 assert cm['b'] == 2 assert cm['d'] == 4 try: print cm['f'] except KeyError: pass else: raise Exception('Did not raise KeyError for missing key') assert 'a' in cm and 'b' in cm and 'd' in cm assert cm.get('a', 10) == 1 assert cm.get('b', 20) == 2 assert cm.get('d', 30) == 4 assert cm.get('f', 40) == 40