Skip to content

Commit

Permalink
pythongh-110275: Named tuple's __replace__() now raise TypeError for …
Browse files Browse the repository at this point in the history
…invalid arguments
  • Loading branch information
serhiy-storchaka committed Oct 3, 2023
1 parent eeb4e97 commit e0fd7f7
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 2 deletions.
11 changes: 10 additions & 1 deletion Lib/collections/__init__.py
Expand Up @@ -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
Expand All @@ -480,6 +488,7 @@ def __getnewargs__(self):
__new__,
_make.__func__,
_replace,
__replace__,
__repr__,
_asdict,
__getnewargs__,
Expand All @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_copy.py
Expand Up @@ -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):
Expand Down

0 comments on commit e0fd7f7

Please sign in to comment.