def __getitem__(self, key): try: return PersistentMapping.__getitem__(self, key) except KeyError: if type(key) == type(0): return self.get_list()[key] if type(key) == type(""): keys = self.keys() l = self.__class__() # first check if key can be found in start of key-strings shortened_keys = map(lambda x: (x, x[:len(key)]), keys) for k, sk in shortened_keys: if key == sk: l[k] = self[k] if len(l) == 0: # then check if it can be found anywhere for k in keys: if k.find(key) > -1: l[k] = self[k] # return either 1 object or list of objects if len(l) == 1: return l[0] if l: return l # key not found, so raise KeyError