Mercurial > p > roundup > code
diff roundup/cgi/MultiMapping.py @ 2162:53c600091f17
fixed MultiMapping
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Tue, 30 Mar 2004 06:35:33 +0000 |
| parents | 55ab0c5b49f9 |
| children |
line wrap: on
line diff
--- a/roundup/cgi/MultiMapping.py Tue Mar 30 06:23:11 2004 +0000 +++ b/roundup/cgi/MultiMapping.py Tue Mar 30 06:35:33 2004 +0000 @@ -1,14 +1,19 @@ -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): @@ -16,10 +21,43 @@ 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 +
