1 """Ordered dictionary.
2
3 This is a dictionary class that preserves the order in which the keys are
4 stored. This is necessary to build Structures and Sequences that follow the
5 requested variable order.
6 """
7
8 __author__ = "Roberto De Almeida <rob@pydap.org>"
9
10 import copy
11
12
14
15 """Ordered dictionary."""
16
18 self._keys = []
19 self._dict = {}
20
21 if odict is not None:
22 self.update(odict)
23
25 return iter(self._keys[:])
26
28 self._dict.__setitem__(key, item)
29 if key not in self._keys: self._keys.append(key)
30
33
35 self._dict.__delitem__(key)
36 self._keys.remove(key)
37
39 return self._keys[:]
40
42 return [(key, self._dict.__getitem__(key)) for key in self._keys]
43
45 return [self._dict.__getitem__(key) for key in self._keys]
46
48 for key in self._keys: yield key
49
51 for key in self._keys: yield (key, self._dict.__getitem__(key))
52
54 for key in self._keys: yield self._dict.__getitem__(key)
55
57 self._dict.clear()
58 self._keys = []
59
61 new = odict(self)
62 return new
63
67
69 if key not in self._keys: self._keys.append(key)
70 return self._dict.setdefault(key, d)
71
72 - def get(self, key, d=None):
73 if key in self._keys: return self._dict.__getitem__(key)
74 else: return d
75
78
80 try: key = self._keys[-1]
81 except IndexError: raise KeyError('dictionary is empty')
82
83 self._keys.remove(key)
84 return self._dict.pop(key)
85
86 - def pop(self, key, d=None):
87 value = self._dict.pop(key, d)
88
89 try: self._keys.remove(key)
90 except ValueError: pass
91
92 return value
93
98
101
104
107
110
113
119
120
122 import doctest
123 doctest.testmod()
124
125 if __name__ == "__main__":
126 _test()
127