diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index a461550ea40da7..55de8e1b510c6d 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -463,6 +463,14 @@ def _replace(self, /, **kwds): _replace.__doc__ = (f'Return a new {typename} object replacing specified ' 'fields with new values') + def __replace__(self, /, **kwds): + result = self._make(_map(kwds.pop, field_names, self)) + for name in kwds: + raise TypeError(f'Got unexpected keyword argument {name!r}') + return result + + __replace__.__doc__ = _replace.__doc__ + def __repr__(self): 'Return a nicely formatted representation string' return self.__class__.__name__ + repr_fmt % self @@ -480,6 +488,7 @@ def __getnewargs__(self): __new__, _make.__func__, _replace, + __replace__, __repr__, _asdict, __getnewargs__, @@ -495,7 +504,7 @@ def __getnewargs__(self): '_field_defaults': field_defaults, '__new__': __new__, '_make': _make, - '__replace__': _replace, + '__replace__': __replace__, '_replace': _replace, '__repr__': __repr__, '_asdict': _asdict, diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index 60735ba89a80ee..429ee3f4977daa 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -952,7 +952,7 @@ class PointFromClass(NamedTuple): self.assertEqual(copy.replace(p, x=1), (1, 22)) self.assertEqual(copy.replace(p, y=2), (11, 2)) self.assertEqual(copy.replace(p, x=1, y=2), (1, 2)) - with self.assertRaisesRegex(ValueError, 'unexpected field name'): + with self.assertRaisesRegex(TypeError, 'unexpected keyword argument'): copy.replace(p, x=1, error=2) def test_dataclass(self):