diff options
author | Raymond Hettinger <python@rcn.com> | 2011-01-04 20:57:19 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2011-01-04 20:57:19 (GMT) |
commit | 1d879f68525858fcfa7aacdd7cd16721a89c62c4 (patch) | |
tree | 9f4e1ce068d51af37876cb9a45e4dd995de4c926 /Lib/collections.py | |
parent | db0ef2b5e51b393736f20e81d23d68c9b92a04b4 (diff) | |
download | cpython-1d879f68525858fcfa7aacdd7cd16721a89c62c4.zip cpython-1d879f68525858fcfa7aacdd7cd16721a89c62c4.tar.gz cpython-1d879f68525858fcfa7aacdd7cd16721a89c62c4.tar.bz2 |
Backport r87613 to make OrderedDict subclassing match dict subclassing.
Diffstat (limited to 'Lib/collections.py')
-rw-r--r-- | Lib/collections.py | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/Lib/collections.py b/Lib/collections.py index 3329f08..27bb5e1 100644 --- a/Lib/collections.py +++ b/Lib/collections.py @@ -21,7 +21,7 @@ from itertools import repeat as _repeat, chain as _chain, starmap as _starmap class _Link(object): __slots__ = 'prev', 'next', 'key', '__weakref__' -class OrderedDict(dict, MutableMapping): +class OrderedDict(dict): 'Dictionary that remembers insertion order' # An inherited dict maps keys to values. # The inherited dict provides __getitem__, __len__, __contains__, and get. @@ -50,7 +50,7 @@ class OrderedDict(dict, MutableMapping): self.__root = root = _Link() # sentinel node for the doubly linked list root.prev = root.next = root self.__map = {} - self.update(*args, **kwds) + self.__update(*args, **kwds) def clear(self): 'od.clear() -> None. Remove all items from od.' @@ -109,13 +109,29 @@ class OrderedDict(dict, MutableMapping): return (self.__class__, (items,), inst_dict) return self.__class__, (items,) - setdefault = MutableMapping.setdefault - update = MutableMapping.update - pop = MutableMapping.pop + update = __update = MutableMapping.update keys = MutableMapping.keys values = MutableMapping.values items = MutableMapping.items + __marker = object() + + def pop(self, key, default=__marker): + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + def popitem(self, last=True): '''od.popitem() -> (k, v), return and remove a (key, value) pair. Pairs are returned in LIFO order if last is true or FIFO order if false. |