Kaydet (Commit) 170b3f79 authored tarafından Miss Islington (bot)'s avatar Miss Islington (bot) Kaydeden (comit) Raymond Hettinger

bpo-32792: Preserve mapping order in ChainMap() (GH-5586) (#GH-5617)

(cherry picked from commit 3793f95f)
Co-authored-by: 's avatarRaymond Hettinger <rhettinger@users.noreply.github.com>
üst e6033209
......@@ -914,7 +914,10 @@ class ChainMap(MutableMapping):
return len(set().union(*self.maps)) # reuses stored hash values if possible
def __iter__(self):
return iter(set().union(*self.maps))
d = {}
for mapping in reversed(self.maps):
d.update(mapping) # reuses stored hash values if possible
return iter(d)
def __contains__(self, key):
return any(key in m for m in self.maps)
......
......@@ -141,6 +141,23 @@ class TestChainMap(unittest.TestCase):
with self.assertRaises(KeyError):
d.popitem()
def test_order_preservation(self):
d = ChainMap(
OrderedDict(j=0, h=88888),
OrderedDict(),
OrderedDict(i=9999, d=4444, c=3333),
OrderedDict(f=666, b=222, g=777, c=333, h=888),
OrderedDict(),
OrderedDict(e=55, b=22),
OrderedDict(a=1, b=2, c=3, d=4, e=5),
OrderedDict(),
)
self.assertEqual(''.join(d), 'abcdefghij')
self.assertEqual(list(d.items()),
[('a', 1), ('b', 222), ('c', 3333), ('d', 4444),
('e', 55), ('f', 666), ('g', 777), ('h', 88888),
('i', 9999), ('j', 0)])
def test_dict_coercion(self):
d = ChainMap(dict(a=1, b=2), dict(b=20, c=30))
self.assertEqual(dict(d), dict(a=1, b=2, c=30))
......
collections.ChainMap() preserves the order of the underlying mappings.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment