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

Source Code for Module lacewing.multidict

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