[Python-checkins] bpo-43245: Add keyword argument support to ChainMap.new_child() (GH-24788)

rhettinger webhook-mailer at python.org
Sat Mar 13 22:15:51 EST 2021


https://github.com/python/cpython/commit/9923df96413a0b480a34ec1d537b66ca0eeb0fdc
commit: 9923df96413a0b480a34ec1d537b66ca0eeb0fdc
branch: master
author: Kamil Turek <kamil.turek at hotmail.com>
committer: rhettinger <rhettinger at users.noreply.github.com>
date: 2021-03-13T19:15:44-08:00
summary:

bpo-43245: Add keyword argument support to ChainMap.new_child() (GH-24788)

files:
A Misc/NEWS.d/next/Library/2021-03-08-22-14-37.bpo-43245.nXL-MC.rst
M Doc/library/collections.rst
M Lib/collections/__init__.py
M Lib/test/test_collections.py

diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst
index 540db2002343e..723c9da7be8d7 100644
--- a/Doc/library/collections.rst
+++ b/Doc/library/collections.rst
@@ -72,19 +72,23 @@ The class can be used to simulate nested scopes and is useful in templating.
         be modified to change which mappings are searched.  The list should
         always contain at least one mapping.
 
-    .. method:: new_child(m=None)
+    .. method:: new_child(m=None, **kwargs)
 
         Returns a new :class:`ChainMap` containing a new map followed by
         all of the maps in the current instance.  If ``m`` is specified,
         it becomes the new map at the front of the list of mappings; if not
         specified, an empty dict is used, so that a call to ``d.new_child()``
-        is equivalent to: ``ChainMap({}, *d.maps)``.  This method is used for
-        creating subcontexts that can be updated without altering values in any
-        of the parent mappings.
+        is equivalent to: ``ChainMap({}, *d.maps)``. If any keyword arguments
+        are specified, they update passed map or new empty dict. This method
+        is used for creating subcontexts that can be updated without altering
+        values in any of the parent mappings.
 
         .. versionchanged:: 3.4
            The optional ``m`` parameter was added.
 
+        .. versionchanged:: 3.10
+           Keyword arguments support was added.
+
     .. attribute:: parents
 
         Property returning a new :class:`ChainMap` containing all of the maps in
diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py
index 6404ea9022457..89c73bbf2c10d 100644
--- a/Lib/collections/__init__.py
+++ b/Lib/collections/__init__.py
@@ -1010,12 +1010,15 @@ def copy(self):
 
     __copy__ = copy
 
-    def new_child(self, m=None):                # like Django's Context.push()
+    def new_child(self, m=None, **kwargs):      # like Django's Context.push()
         '''New ChainMap with a new map followed by all previous maps.
         If no map is provided, an empty dict is used.
+        Keyword arguments update the map or new empty dict.
         '''
         if m is None:
-            m = {}
+            m = kwargs
+        elif kwargs:
+            m.update(kwargs)
         return self.__class__(m, *self.maps)
 
     @property
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
index d1c305a4a39c9..30303f00ba5c1 100644
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -249,6 +249,10 @@ def __contains__(self, key):
         for k, v in dict(a=1, B=20, C=30, z=100).items():             # check get
             self.assertEqual(d.get(k, 100), v)
 
+        c = ChainMap({'a': 1, 'b': 2})
+        d = c.new_child(b=20, c=30)
+        self.assertEqual(d.maps, [{'b': 20, 'c': 30}, {'a': 1, 'b': 2}])
+
     def test_union_operators(self):
         cm1 = ChainMap(dict(a=1, b=2), dict(c=3, d=4))
         cm2 = ChainMap(dict(a=10, e=5), dict(b=20, d=4))
diff --git a/Misc/NEWS.d/next/Library/2021-03-08-22-14-37.bpo-43245.nXL-MC.rst b/Misc/NEWS.d/next/Library/2021-03-08-22-14-37.bpo-43245.nXL-MC.rst
new file mode 100644
index 0000000000000..394318fb1e867
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-03-08-22-14-37.bpo-43245.nXL-MC.rst
@@ -0,0 +1 @@
+Add keyword arguments support to ``ChainMap.new_child()``.
\ No newline at end of file



More information about the Python-checkins mailing list