]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #19505: The items, keys, and values views of OrderedDict now support
authorSerhiy Storchaka <storchaka@gmail.com>
Fri, 4 Apr 2014 12:19:36 +0000 (15:19 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Fri, 4 Apr 2014 12:19:36 +0000 (15:19 +0300)
reverse iteration using reversed().

Doc/library/collections.rst
Lib/collections/__init__.py
Lib/test/test_collections.py
Misc/NEWS

index f5fe12a739d333ee2831e1746d1e4fefc8c1f000..06ba0420c5b61f152354cbe5730c2bec5a7293e1 100644 (file)
@@ -978,6 +978,9 @@ The :class:`OrderedDict` constructor and :meth:`update` method both accept
 keyword arguments, but their order is lost because Python's function call
 semantics pass-in keyword arguments using a regular unordered dictionary.
 
+.. versionchanged:: 3.5
+   The items, keys, and values :term:`views <view>` of :class:`OrderedDict` now
+   support reverse iteration using :func:`reversed`.
 
 :class:`OrderedDict` Examples and Recipes
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
index d6deb6a7b2621ae4e1fd07b46749fa54eea18822..3605cc3bc331a9786691522f382f2d6c74f6894e 100644 (file)
@@ -20,6 +20,23 @@ from reprlib import recursive_repr as _recursive_repr
 ### OrderedDict
 ################################################################################
 
+class _OrderedDictKeysView(KeysView):
+
+    def __reversed__(self):
+        yield from reversed(self._mapping)
+
+class _OrderedDictItemsView(ItemsView):
+
+    def __reversed__(self):
+        for key in reversed(self._mapping):
+            yield (key, self._mapping[key])
+
+class _OrderedDictValuesView(ValuesView):
+
+    def __reversed__(self):
+        for key in reversed(self._mapping):
+            yield self._mapping[key]
+
 class _Link(object):
     __slots__ = 'prev', 'next', 'key', '__weakref__'
 
@@ -162,9 +179,19 @@ class OrderedDict(dict):
         return size
 
     update = __update = MutableMapping.update
-    keys = MutableMapping.keys
-    values = MutableMapping.values
-    items = MutableMapping.items
+
+    def keys(self):
+        "D.keys() -> a set-like object providing a view on D's keys"
+        return _OrderedDictKeysView(self)
+
+    def items(self):
+        "D.items() -> a set-like object providing a view on D's items"
+        return _OrderedDictItemsView(self)
+
+    def values(self):
+        "D.values() -> an object providing a view on D's values"
+        return _OrderedDictValuesView(self)
+
     __ne__ = MutableMapping.__ne__
 
     __marker = object()
index ee28a6c0b35f2b6d648142ca4c90c23d982968b6..d352d2a42417d85a3ed99d03f779bef8c78e8f70 100644 (file)
@@ -1187,6 +1187,11 @@ class TestOrderedDict(unittest.TestCase):
         self.assertEqual(list(od.items()), pairs)
         self.assertEqual(list(reversed(od)),
                          [t[0] for t in reversed(pairs)])
+        self.assertEqual(list(reversed(od.keys())),
+                         [t[0] for t in reversed(pairs)])
+        self.assertEqual(list(reversed(od.values())),
+                         [t[1] for t in reversed(pairs)])
+        self.assertEqual(list(reversed(od.items())), list(reversed(pairs)))
 
     def test_popitem(self):
         pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]
index 5466267a8ef0a2fd0999730fa681c7db1ce222a7..a1bb6c23f83dbda06d9fcb25197cf4d1eb200f92 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -29,6 +29,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #19505: The items, keys, and values views of OrderedDict now support
+  reverse iteration using reversed().
+
 - Issue #21149: Improved thread-safety in logging cleanup during interpreter
   shutdown. Thanks to Devin Jeanpierre for the patch.