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
__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
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))