index b528288766c99c9d6016e1f1357bdd7efa180563..583e2d797d1466c1358a97a0e084cf8cd4787376 100644 (file)
-import operator
-
class MultiMapping:
def __init__(self, *stores):
self.stores = list(stores)
+ self.stores.reverse()
+
def __getitem__(self, key):
for store in self.stores:
if store.has_key(key):
return store[key]
raise KeyError, key
+
+ def __setitem__(self, key, val):
+ self.stores[0][key] = val
+
_marker = []
+
def get(self, key, default=_marker):
for store in self.stores:
if store.has_key(key):
if default is self._marker:
raise KeyError, key
return default
+
def __len__(self):
- return reduce(operator.add, [len(x) for x in stores], 0)
+ return len(self.items())
+
+ def has_key(self, key):
+ for store in self.stores:
+ if store.has_key(key):
+ return 1
+ return 0
+
def push(self, store):
- self.stores.append(store)
+ self.stores = [store] + self.stores
+
def pop(self):
- return self.stores.pop()
+ if not len(self.stores):
+ return None
+ store, self.stores = self.stores[0], self.stores[1:]
+ return store
+
+ def keys(self):
+ return [ _[0] for _ in self.items() ]
+
+ def values(self):
+ return [ _[1] for _ in self.items() ]
+
+ def copy(self):
+ copy = MultiMapping()
+ copy.stores = [_.copy() for _ in self.stores]
+ return copy
+
+ def items(self):
+ l = []
+ seen = {}
+ for store in self.stores:
+ for k, v in store.items():
+ if not seen.has_key(k):
+ l.append((k, v))
+ seen[k] = 1
+ return l