comparison 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
comparison
equal deleted inserted replaced
2161:98656054ccfa 2162:53c600091f17
1 import operator
2
3 class MultiMapping: 1 class MultiMapping:
4 def __init__(self, *stores): 2 def __init__(self, *stores):
5 self.stores = list(stores) 3 self.stores = list(stores)
4 self.stores.reverse()
5
6 def __getitem__(self, key): 6 def __getitem__(self, key):
7 for store in self.stores: 7 for store in self.stores:
8 if store.has_key(key): 8 if store.has_key(key):
9 return store[key] 9 return store[key]
10 raise KeyError, key 10 raise KeyError, key
11
12 def __setitem__(self, key, val):
13 self.stores[0][key] = val
14
11 _marker = [] 15 _marker = []
16
12 def get(self, key, default=_marker): 17 def get(self, key, default=_marker):
13 for store in self.stores: 18 for store in self.stores:
14 if store.has_key(key): 19 if store.has_key(key):
15 return store[key] 20 return store[key]
16 if default is self._marker: 21 if default is self._marker:
17 raise KeyError, key 22 raise KeyError, key
18 return default 23 return default
24
19 def __len__(self): 25 def __len__(self):
20 return reduce(operator.add, [len(x) for x in stores], 0) 26 return len(self.items())
27
28 def has_key(self, key):
29 for store in self.stores:
30 if store.has_key(key):
31 return 1
32 return 0
33
21 def push(self, store): 34 def push(self, store):
22 self.stores.append(store) 35 self.stores = [store] + self.stores
36
23 def pop(self): 37 def pop(self):
24 return self.stores.pop() 38 if not len(self.stores):
39 return None
40 store, self.stores = self.stores[0], self.stores[1:]
41 return store
25 42
43 def keys(self):
44 return [ _[0] for _ in self.items() ]
45
46 def values(self):
47 return [ _[1] for _ in self.items() ]
48
49 def copy(self):
50 copy = MultiMapping()
51 copy.stores = [_.copy() for _ in self.stores]
52 return copy
53
54 def items(self):
55 l = []
56 seen = {}
57 for store in self.stores:
58 for k, v in store.items():
59 if not seen.has_key(k):
60 l.append((k, v))
61 seen[k] = 1
62 return l
63

Roundup Issue Tracker: http://roundup-tracker.org/