| 174 | # (i.e., if a taxonomy term has multiple parents, the most recent parent is the default). |
| 175 | |
| 176 | class odict(dict): |
| 177 | |
| 178 | def __init__(self, items=[]): |
| 179 | """ A dictionary with ordered keys (first-in last-out). |
| 180 | """ |
| 181 | dict.__init__(self) |
| 182 | self._o = [] # List of ordered keys. |
| 183 | if isinstance(items, dict): |
| 184 | items = reversed(items.items()) |
| 185 | for k, v in items: |
| 186 | self.__setitem__(k, v) |
| 187 | |
| 188 | @classmethod |
| 189 | def fromkeys(cls, keys=[], v=None): |
| 190 | return cls((k, v) for k in keys) |
| 191 | |
| 192 | def push(self, (k, v)): |
| 193 | """ Adds a new item from the given (key, value)-tuple. |
| 194 | If the key exists, pushes the updated item to the head of the dict. |
| 195 | """ |
| 196 | if k in self: |
| 197 | self.__delitem__(k) |
| 198 | self.__setitem__(k, v) |
| 199 | append = push |
| 200 | |
| 201 | def __iter__(self): |
| 202 | return reversed(self._o) |
| 203 | |
| 204 | def __setitem__(self, k, v): |
| 205 | if k not in self: |
| 206 | self._o.append(k) |
| 207 | dict.__setitem__(self, k, v) |
| 208 | |
| 209 | def __delitem__(self, k): |
| 210 | self._o.remove(k) |
| 211 | dict.__delitem__(self, k) |
| 212 | |
| 213 | def update(self, d): |
| 214 | for k, v in reversed(d.items()): |
| 215 | self.__setitem__(k, v) |
| 216 | |
| 217 | def setdefault(self, k, v=None): |
| 218 | if not k in self: |
| 219 | self.__setitem__(k, v) |
| 220 | return self[k] |
| 221 | |
| 222 | def pop(self, k, *args, **kwargs): |
| 223 | if k in self: |
| 224 | self._o.remove(k) |
| 225 | return dict.pop(self, k, *args, **kwargs) |
| 226 | |
| 227 | def popitem(self): |
| 228 | k=self._o[-1] if self._o else None; return (k, self.pop(k)) |
| 229 | |
| 230 | def clear(self): |
| 231 | self._o=[]; dict.clear(self) |
| 232 | |
| 233 | def iterkeys(self): |
no outgoing calls
no test coverage detected
searching dependent graphs…