Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 578c921

Browse files
Issue #19505: The items, keys, and values views of OrderedDict now support
reverse iteration using reversed().
1 parent 3d1e2e4 commit 578c921

4 files changed

Lines changed: 41 additions & 3 deletions

File tree

Doc/library/collections.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,9 @@ The :class:`OrderedDict` constructor and :meth:`update` method both accept
978978
keyword arguments, but their order is lost because Python's function call
979979
semantics pass-in keyword arguments using a regular unordered dictionary.
980980

981+
.. versionchanged:: 3.5
982+
The items, keys, and values :term:`views <view>` of :class:`OrderedDict` now
983+
support reverse iteration using :func:`reversed`.
981984

982985
:class:`OrderedDict` Examples and Recipes
983986
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Lib/collections/__init__.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,23 @@
2020
### OrderedDict
2121
################################################################################
2222

23+
class _OrderedDictKeysView(KeysView):
24+
25+
def __reversed__(self):
26+
yield from reversed(self._mapping)
27+
28+
class _OrderedDictItemsView(ItemsView):
29+
30+
def __reversed__(self):
31+
for key in reversed(self._mapping):
32+
yield (key, self._mapping[key])
33+
34+
class _OrderedDictValuesView(ValuesView):
35+
36+
def __reversed__(self):
37+
for key in reversed(self._mapping):
38+
yield self._mapping[key]
39+
2340
class _Link(object):
2441
__slots__ = 'prev', 'next', 'key', '__weakref__'
2542

@@ -162,9 +179,19 @@ def __sizeof__(self):
162179
return size
163180

164181
update = __update = MutableMapping.update
165-
keys = MutableMapping.keys
166-
values = MutableMapping.values
167-
items = MutableMapping.items
182+
183+
def keys(self):
184+
"D.keys() -> a set-like object providing a view on D's keys"
185+
return _OrderedDictKeysView(self)
186+
187+
def items(self):
188+
"D.items() -> a set-like object providing a view on D's items"
189+
return _OrderedDictItemsView(self)
190+
191+
def values(self):
192+
"D.values() -> an object providing a view on D's values"
193+
return _OrderedDictValuesView(self)
194+
168195
__ne__ = MutableMapping.__ne__
169196

170197
__marker = object()

Lib/test/test_collections.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,6 +1187,11 @@ def test_iterators(self):
11871187
self.assertEqual(list(od.items()), pairs)
11881188
self.assertEqual(list(reversed(od)),
11891189
[t[0] for t in reversed(pairs)])
1190+
self.assertEqual(list(reversed(od.keys())),
1191+
[t[0] for t in reversed(pairs)])
1192+
self.assertEqual(list(reversed(od.values())),
1193+
[t[1] for t in reversed(pairs)])
1194+
self.assertEqual(list(reversed(od.items())), list(reversed(pairs)))
11901195

11911196
def test_popitem(self):
11921197
pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ Core and Builtins
2929
Library
3030
-------
3131

32+
- Issue #19505: The items, keys, and values views of OrderedDict now support
33+
reverse iteration using reversed().
34+
3235
- Issue #21149: Improved thread-safety in logging cleanup during interpreter
3336
shutdown. Thanks to Devin Jeanpierre for the patch.
3437

0 commit comments

Comments
 (0)