Skip to content

Also test typing.NamedTuple with copy.replace #109956

Closed
@sobolevn

Description

@sobolevn

Bug report

Right now only collections.namedtuple is tested:

def test_namedtuple(self):
from collections import namedtuple
Point = namedtuple('Point', 'x y', defaults=(0,))
p = Point(11, 22)
self.assertEqual(copy.replace(p), (11, 22))
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'):
copy.replace(p, x=1, error=2)

@serhiy-storchaka noted in #108752 (comment) that only named tuples created by collections.namedtuple() are supported. But, since typing.NamedTuple uses collections.namedtuple inside:

cpython/Lib/typing.py

Lines 2695 to 2696 in b1aebf1

nm_tpl = collections.namedtuple(name, fields,
defaults=defaults, module=module)
it is also supported:

>>> import typing
>>> 
>>> class N(typing.NamedTuple):
...    x: int
...    y: int
... 
>>> N.__replace__
<function N._replace at 0x10580a210>
>>> import copy
>>> copy.replace(N(1, 2), x=3)
N(x=3, y=2)

I have a PR ready with extra tests.

Refs #108751
Refs #108752

Linked PRs

Metadata

Metadata

Assignees

Labels

testsTests in the Lib/test dirtype-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions