diff -r e5476ecb8b57 Doc/library/collections.rst --- a/Doc/library/collections.rst Wed Nov 06 19:03:11 2013 +0100 +++ b/Doc/library/collections.rst Wed Nov 06 23:27:16 2013 +0200 @@ -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.4 + The items, keys, and values :term:`views ` of :class:`OrderedDict` now + support reverse iteration using :func:`reversed`. :class:`OrderedDict` Examples and Recipes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff -r e5476ecb8b57 Lib/collections/__init__.py --- a/Lib/collections/__init__.py Wed Nov 06 19:03:11 2013 +0100 +++ b/Lib/collections/__init__.py Wed Nov 06 23:27:16 2013 +0200 @@ -23,6 +23,23 @@ class _Link(object): __slots__ = 'prev', 'next', 'key', '__weakref__' +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 OrderedDict(dict): 'Dictionary that remembers insertion order' # An inherited dict maps keys to values. @@ -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 e5476ecb8b57 Lib/test/test_collections.py --- a/Lib/test/test_collections.py Wed Nov 06 19:03:11 2013 +0100 +++ b/Lib/test/test_collections.py Wed Nov 06 23:27:16 2013 +0200 @@ -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)]