mirror of
https://github.com/python/cpython.git
synced 2026-04-22 03:41:08 +00:00
bpo-36060: Document how collections.ChainMap() determines iteration order (GH-11969) (GH-11978)
(cherry picked from commit 86f093f71a)
Co-authored-by: Raymond Hettinger <rhettinger@users.noreply.github.com>
This commit is contained in:
parent
3bd3a71a1a
commit
7121a6eeb7
2 changed files with 29 additions and 0 deletions
|
|
@ -100,6 +100,21 @@ The class can be used to simulate nested scopes and is useful in templating.
|
|||
:func:`super` function. A reference to ``d.parents`` is equivalent to:
|
||||
``ChainMap(*d.maps[1:])``.
|
||||
|
||||
Note, the iteration order of a :class:`ChainMap()` is determined by
|
||||
scanning the mappings last to first::
|
||||
|
||||
>>> baseline = {'music': 'bach', 'art': 'rembrandt'}
|
||||
>>> adjustments = {'art': 'van gogh', 'opera': 'carmen'}
|
||||
>>> list(ChainMap(adjustments, baseline))
|
||||
['music', 'art', 'opera']
|
||||
|
||||
This gives the same ordering as a series of :meth:`dict.update` calls
|
||||
starting with the last mapping::
|
||||
|
||||
>>> combined = baseline.copy()
|
||||
>>> combined.update(adjustments)
|
||||
>>> list(combined)
|
||||
['music', 'art', 'opera']
|
||||
|
||||
.. seealso::
|
||||
|
||||
|
|
|
|||
|
|
@ -114,6 +114,20 @@ def test_basics(self):
|
|||
self.assertEqual(f['b'], 5) # find first in chain
|
||||
self.assertEqual(f.parents['b'], 2) # look beyond maps[0]
|
||||
|
||||
def test_ordering(self):
|
||||
# Combined order matches a series of dict updates from last to first.
|
||||
# This test relies on the ordering of the underlying dicts.
|
||||
|
||||
baseline = {'music': 'bach', 'art': 'rembrandt'}
|
||||
adjustments = {'art': 'van gogh', 'opera': 'carmen'}
|
||||
|
||||
cm = ChainMap(adjustments, baseline)
|
||||
|
||||
combined = baseline.copy()
|
||||
combined.update(adjustments)
|
||||
|
||||
self.assertEqual(list(combined.items()), list(cm.items()))
|
||||
|
||||
def test_constructor(self):
|
||||
self.assertEqual(ChainMap().maps, [{}]) # no-args --> one new dict
|
||||
self.assertEqual(ChainMap({1:2}).maps, [{1:2}]) # 1 arg --> list
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue