changeset: 90126:cee010fecdf5 user: Serhiy Storchaka date: Fri Apr 04 15:19:36 2014 +0300 files: Doc/library/collections.rst Lib/collections/__init__.py Lib/test/test_collections.py Misc/NEWS description: Issue #19505: The items, keys, and values views of OrderedDict now support reverse iteration using reversed(). diff -r 76689a706900 -r cee010fecdf5 Doc/library/collections.rst --- a/Doc/library/collections.rst Fri Apr 04 10:57:25 2014 +0100 +++ b/Doc/library/collections.rst Fri Apr 04 15:19:36 2014 +0300 @@ -978,6 +978,9 @@ 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 ` of :class:`OrderedDict` now + support reverse iteration using :func:`reversed`. :class:`OrderedDict` Examples and Recipes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff -r 76689a706900 -r cee010fecdf5 Lib/collections/__init__.py --- a/Lib/collections/__init__.py Fri Apr 04 10:57:25 2014 +0100 +++ b/Lib/collections/__init__.py Fri Apr 04 15:19:36 2014 +0300 @@ -20,6 +20,23 @@ ### 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 @@ 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() diff -r 76689a706900 -r cee010fecdf5 Lib/test/test_collections.py --- a/Lib/test/test_collections.py Fri Apr 04 10:57:25 2014 +0100 +++ b/Lib/test/test_collections.py Fri Apr 04 15:19:36 2014 +0300 @@ -1187,6 +1187,11 @@ 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)] diff -r 76689a706900 -r cee010fecdf5 Misc/NEWS --- a/Misc/NEWS Fri Apr 04 10:57:25 2014 +0100 +++ b/Misc/NEWS Fri Apr 04 15:19:36 2014 +0300 @@ -29,6 +29,9 @@ 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.