Skip to content

Commit

Permalink
pythongh-110275: Named tuple's __replace__() now raises TypeError for…
Browse files Browse the repository at this point in the history
… invalid arguments (pythonGH-110299)
  • Loading branch information
serhiy-storchaka authored and aisk committed Feb 11, 2024
1 parent 4fb94c8 commit 97767fc
Show file tree
Hide file tree
Showing 5 changed files with 9 additions and 7 deletions.
4 changes: 4 additions & 0 deletions Doc/library/collections.rst
Expand Up @@ -981,6 +981,10 @@ field names, the method and attribute names start with an underscore.

Named tuples are also supported by generic function :func:`copy.replace`.

.. versionchanged:: 3.13
Raise :exc:`TypeError` instead of :exc:`ValueError` for invalid
keyword arguments.

.. attribute:: somenamedtuple._fields

Tuple of strings listing the field names. Useful for introspection
Expand Down
2 changes: 1 addition & 1 deletion Lib/collections/__init__.py
Expand Up @@ -457,7 +457,7 @@ def _make(cls, iterable):
def _replace(self, /, **kwds):
result = self._make(_map(kwds.pop, field_names, self))
if kwds:
raise ValueError(f'Got unexpected field names: {list(kwds)!r}')
raise TypeError(f'Got unexpected field names: {list(kwds)!r}')
return result

_replace.__doc__ = (f'Return a new {typename} object replacing specified '
Expand Down
6 changes: 1 addition & 5 deletions Lib/test/test_collections.py
Expand Up @@ -488,12 +488,8 @@ def test_instance(self):
self.assertEqual(p._replace(x=1), (1, 22)) # test _replace method
self.assertEqual(p._asdict(), dict(x=11, y=22)) # test _asdict method

try:
with self.assertRaises(TypeError):
p._replace(x=1, error=2)
except ValueError:
pass
else:
self._fail('Did not detect an incorrect fieldname')

# verify that field string can have commas
Point = namedtuple('Point', 'x, y')
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 field name'):
copy.replace(p, x=1, error=2)

def test_dataclass(self):
Expand Down
@@ -0,0 +1,2 @@
Named tuple's methods ``_replace()`` and ``__replace__()`` now raise
TypeError instead of ValueError for invalid keyword arguments.

0 comments on commit 97767fc

Please sign in to comment.