Package dap :: Package util :: Module ordereddict
[hide private]
[frames] | no frames]

Source Code for Module dap.util.ordereddict

  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   
13 -class odict(dict):
14 15 """Ordered dictionary.""" 16
17 - def __init__(self, odict=None):
18 self._keys = [] 19 self._dict = {} 20 21 if odict is not None: 22 self.update(odict)
23
24 - def __iter__(self):
25 return iter(self._keys[:])
26
27 - def __setitem__(self, key, item):
28 self._dict.__setitem__(key, item) 29 if key not in self._keys: self._keys.append(key)
30
31 - def __getitem__(self, key):
32 return self._dict.__getitem__(key)
33
34 - def __delitem__(self, key):
35 self._dict.__delitem__(key) 36 self._keys.remove(key)
37
38 - def keys(self):
39 return self._keys[:]
40
41 - def items(self):
42 return [(key, self._dict.__getitem__(key)) for key in self._keys]
43
44 - def values(self):
45 return [self._dict.__getitem__(key) for key in self._keys]
46
47 - def iterkeys(self):
48 for key in self._keys: yield key
49
50 - def iteritems(self):
51 for key in self._keys: yield (key, self._dict.__getitem__(key))
52
53 - def itervalues(self):
54 for key in self._keys: yield self._dict.__getitem__(key)
55
56 - def clear(self):
57 self._dict.clear() 58 self._keys = []
59
60 - def copy(self):
61 new = odict(self) 62 return new
63
64 - def update(self, odict):
65 for k, v in odict.items(): 66 self.__setitem__(k, v)
67
68 - def setdefault(self, key, d=None):
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
76 - def has_key(self, key):
77 return self._dict.has_key(key)
78
79 - def popitem(self):
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
94 - def fromkeys(keys, d=None):
95 new = odict() 96 for key in keys: new.__setitem__(key, d) 97 return new
98
99 - def __contains__(self, key):
100 return self._dict.has_key(key)
101
102 - def __len__(self):
103 return self._dict.__len__()
104
105 - def __repr__(self):
106 return '{%s}' % ', '.join(['%s: %s' % (k.__repr__(), v.__repr__()) for (k, v) in self.items()])
107
108 - def __str__(self):
109 return '{%s}' % ', '.join(['%s: %s' % (k.__repr__(), v.__repr__()) for (k, v) in self.items()])
110
111 - def __copy__(self):
112 return self.copy()
113
114 - def __deepcopy__(self, memo=None, _nil=[]):
115 new = odict() 116 for k, v in self.items(): 117 new.__setitem__(k, copy.deepcopy(v)) 118 return new
119 120
121 -def _test():
122 import doctest 123 doctest.testmod()
124 125 if __name__ == "__main__": 126 _test() 127