root/gaphor/tags/gaphor-0.12.5/gaphor/misc/odict.py

Revision 1980, 1.6 kB (checked in by wrobe..@pld-linux.org, 1 year ago)

- support iteration over keys in appropriate order
- support swaping two elements

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 # from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
2 class odict(dict):
3     def __init__(self, dict=None):
4         self._keys = []
5         dict.__init__(self, dict)
6
7     def __delitem__(self, key):
8         dict.__delitem__(self, key)
9         self._keys.remove(key)
10
11     def __setitem__(self, key, item):
12         dict.__setitem__(self, key, item)
13         if key not in self._keys: self._keys.append(key)
14
15     def clear(self):
16         dict.clear(self)
17         self._keys = []
18
19     def copy(self):
20         dict = dict.copy(self)
21         dict._keys = self._keys[:]
22         return dict
23
24     def items(self):
25         return zip(self._keys, self.values())
26
27     def keys(self):
28         return self._keys
29
30     def popitem(self):
31         try:
32             key = self._keys[-1]
33         except IndexError:
34             raise KeyError('dictionary is empty')
35
36         val = self[key]
37         del self[key]
38
39         return (key, val)
40
41     def setdefault(self, key, failobj=None):
42         dict.setdefault(self, key, failobj)
43         if key not in self._keys: self._keys.append(key)
44
45     def update(self, dict):
46         dict.update(self, dict)
47         for key in dict.keys():
48             if key not in self._keys: self._keys.append(key)
49
50     def values(self):
51         return map(self.get, self._keys)
52    
53
54     def swap(self, k1, k2):
55         """
56         Swap two elements using their keys.
57         """
58         i1 = self._keys.index(k1)
59         i2 = self._keys.index(k2)
60         self._keys[i1], self._keys[i2] = self._keys[i2], self._keys[i1]
61
62
63     def __iter__(self):
64         for k in self._keys:
65             yield k
Note: See TracBrowser for help on using the browser.