mirror of
https://github.com/python/cpython.git
synced 2025-10-01 12:52:18 +00:00
bpo-42487: don't call __getitem__ of underlying maps in ChainMap.__iter__ (GH-23534) (GH-23569)
This commit is contained in:
parent
03ae7e4518
commit
cf22aa3bc6
3 changed files with 18 additions and 1 deletions
|
@ -949,7 +949,7 @@ class ChainMap(_collections_abc.MutableMapping):
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
d = {}
|
d = {}
|
||||||
for mapping in reversed(self.maps):
|
for mapping in reversed(self.maps):
|
||||||
d.update(mapping) # reuses stored hash values if possible
|
d.update(dict.fromkeys(mapping)) # reuses stored hash values if possible
|
||||||
return iter(d)
|
return iter(d)
|
||||||
|
|
||||||
def __contains__(self, key):
|
def __contains__(self, key):
|
||||||
|
|
|
@ -195,6 +195,22 @@ class TestChainMap(unittest.TestCase):
|
||||||
('e', 55), ('f', 666), ('g', 777), ('h', 88888),
|
('e', 55), ('f', 666), ('g', 777), ('h', 88888),
|
||||||
('i', 9999), ('j', 0)])
|
('i', 9999), ('j', 0)])
|
||||||
|
|
||||||
|
def test_iter_not_calling_getitem_on_maps(self):
|
||||||
|
class DictWithGetItem(UserDict):
|
||||||
|
def __init__(self, *args, **kwds):
|
||||||
|
self.called = False
|
||||||
|
UserDict.__init__(self, *args, **kwds)
|
||||||
|
def __getitem__(self, item):
|
||||||
|
self.called = True
|
||||||
|
UserDict.__getitem__(self, item)
|
||||||
|
|
||||||
|
d = DictWithGetItem(a=1)
|
||||||
|
c = ChainMap(d)
|
||||||
|
d.called = False
|
||||||
|
|
||||||
|
set(c) # iterate over chain map
|
||||||
|
self.assertFalse(d.called, '__getitem__ was called')
|
||||||
|
|
||||||
def test_dict_coercion(self):
|
def test_dict_coercion(self):
|
||||||
d = ChainMap(dict(a=1, b=2), dict(b=20, c=30))
|
d = ChainMap(dict(a=1, b=2), dict(b=20, c=30))
|
||||||
self.assertEqual(dict(d), dict(a=1, b=2, c=30))
|
self.assertEqual(dict(d), dict(a=1, b=2, c=30))
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
ChainMap.__iter__ no longer calls __getitem__ on underlying maps
|
Loading…
Add table
Add a link
Reference in a new issue