Skip to content

Commit c4282a0

Browse files
committed
Issue #24286: Register dict views with the MappingView ABCs.
1 parent 4cfd29f commit c4282a0

4 files changed

Lines changed: 32 additions & 1 deletion

File tree

Lib/_abcoll.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ def __iter__(self):
453453
for key in self._mapping:
454454
yield key
455455

456+
KeysView.register(type({}.viewkeys()))
456457

457458
class ItemsView(MappingView, Set):
458459

@@ -473,6 +474,7 @@ def __iter__(self):
473474
for key in self._mapping:
474475
yield (key, self._mapping[key])
475476

477+
ItemsView.register(type({}.viewitems()))
476478

477479
class ValuesView(MappingView):
478480

@@ -486,6 +488,7 @@ def __iter__(self):
486488
for key in self._mapping:
487489
yield self._mapping[key]
488490

491+
ValuesView.register(type({}.viewvalues()))
489492

490493
class MutableMapping(Mapping):
491494

Lib/test/test_collections.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,10 @@ def test_views(self):
12861286
self.assertEqual(list(od.viewvalues()), [None for k in s])
12871287
self.assertEqual(list(od.viewitems()), [(k, None) for k in s])
12881288

1289+
# See http://bugs.python.org/issue24286
1290+
self.assertEqual(od.viewkeys(), dict(od).viewkeys())
1291+
self.assertEqual(od.viewitems(), dict(od).viewitems())
1292+
12891293
def test_override_update(self):
12901294
# Verify that subclasses can override update() without breaking __init__()
12911295
class MyOD(OrderedDict):

Lib/test/test_dictviews.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import unittest
2+
import collections
23
from test import test_support
34

45
class DictSetTest(unittest.TestCase):
@@ -164,7 +165,26 @@ def test_recursive_repr(self):
164165
d[42] = d.viewvalues()
165166
self.assertRaises(RuntimeError, repr, d)
166167

167-
168+
def test_abc_registry(self):
169+
d = dict(a=1)
170+
171+
self.assertIsInstance(d.viewkeys(), collections.KeysView)
172+
self.assertIsInstance(d.viewkeys(), collections.MappingView)
173+
self.assertIsInstance(d.viewkeys(), collections.Set)
174+
self.assertIsInstance(d.viewkeys(), collections.Sized)
175+
self.assertIsInstance(d.viewkeys(), collections.Iterable)
176+
self.assertIsInstance(d.viewkeys(), collections.Container)
177+
178+
self.assertIsInstance(d.viewvalues(), collections.ValuesView)
179+
self.assertIsInstance(d.viewvalues(), collections.MappingView)
180+
self.assertIsInstance(d.viewvalues(), collections.Sized)
181+
182+
self.assertIsInstance(d.viewitems(), collections.ItemsView)
183+
self.assertIsInstance(d.viewitems(), collections.MappingView)
184+
self.assertIsInstance(d.viewitems(), collections.Set)
185+
self.assertIsInstance(d.viewitems(), collections.Sized)
186+
self.assertIsInstance(d.viewitems(), collections.Iterable)
187+
self.assertIsInstance(d.viewitems(), collections.Container)
168188

169189

170190
def test_main():

Misc/NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ Library
2121
- Issue #24257: Fixed segmentation fault in sqlite3.Row constructor with faked
2222
cursor type.
2323

24+
- Issue #24286: Dict view were not registered with the MappingView abstract
25+
base classes. This caused key and item views in OrderedDict to not be equal
26+
to their regular dict counterparts.
27+
2428
- Issue #22107: tempfile.gettempdir() and tempfile.mkdtemp() now try again
2529
when a directory with the chosen name already exists on Windows as well as
2630
on Unix. tempfile.mkstemp() now fails early if parent directory is not

0 commit comments

Comments
 (0)