Package lacewing :: Module multidict
[frames] | no frames]

Source Code for Module lacewing.multidict

 1  # Copyright (c) 2011 Mathias Kaerlev. 
 2  # See LICENSE for details. 
 3   
4 -class DictItem(object):
5 keys = None 6 value = None 7
8 - def __init__(self, keys, value):
9 self.keys = keys 10 self.value = value
11
12 - def __str__(self):
13 return str(self.value)
14
15 - def __repr__(self):
16 return repr(self.value)
17
18 -class MultikeyDict(dict):
19 items = None
20 - def __init__(self, *arg, **kw):
21 dict.__init__(self, *arg, **kw) 22 self.items = []
23
24 - def __getitem__(self, key):
25 items = dict.__getitem__(self, key) 26 return [item.value for item in items]
27
28 - def __delitem__(self, key):
29 item = dict.__getitem__(self, key) 30 if len(item) > 1: 31 raise KeyError('cannot remove a multi item key') 32 item, = item 33 self.items.remove(item) 34 for itemKey in item.keys: 35 itemList = dict.__getitem__(self, itemKey) 36 if len(itemList) > 1: 37 itemList.remove(item) 38 else: 39 dict.__delitem__(self, itemKey)
40
41 - def __setitem__(self, keys, value):
42 keys = list(keys) + [value] 43 newItem = DictItem(keys, value) 44 self.items.append(newItem) 45 for key in keys: 46 if key in self: 47 dict.__getitem__(self, key).append(newItem) 48 else: 49 dict.__setitem__(self, key, [newItem])
50
51 - def values(self):
52 return [item.value for item in self.items]
53
54 - def itervalues(self):
55 return (item.value for item in self.items)
56
57 - def __len__(self):
58 return len(self.items)
59