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
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 '
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')
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):
--- /dev/null
+Named tuple's methods ``_replace()`` and ``__replace__()`` now raise
+TypeError instead of ValueError for invalid keyword arguments.