]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-43245: Add keyword argument support to ChainMap.new_child() (GH-24788)
authorKamil Turek <kamil.turek@hotmail.com>
Sun, 14 Mar 2021 03:15:44 +0000 (04:15 +0100)
committerGitHub <noreply@github.com>
Sun, 14 Mar 2021 03:15:44 +0000 (19:15 -0800)
Doc/library/collections.rst
Lib/collections/__init__.py
Lib/test/test_collections.py
Misc/NEWS.d/next/Library/2021-03-08-22-14-37.bpo-43245.nXL-MC.rst [new file with mode: 0644]

index 540db2002343e89d5698ee4be133a8c237fd4641..723c9da7be8d7bab1f68187d47993944e1d05cfa 100644 (file)
@@ -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
index 6404ea902245740617f72a9d94005b53470ac175..89c73bbf2c10d9b99e1fe9460bde3add8a94bb12 100644 (file)
@@ -1010,12 +1010,15 @@ class ChainMap(_collections_abc.MutableMapping):
 
     __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
index d1c305a4a39c9b60e628b8909f53e8b66f9c7e79..30303f00ba5c1753e5c2c27dd4daecad88583960 100644 (file)
@@ -249,6 +249,10 @@ class TestChainMap(unittest.TestCase):
         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 (file)
index 0000000..394318f
--- /dev/null
@@ -0,0 +1 @@
+Add keyword arguments support to ``ChainMap.new_child()``.
\ No newline at end of file