From 2bb84a0fff9435955ea22778ffb40bf61cdd052c Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 27 Sep 2023 12:49:27 +0300 Subject: [PATCH 1/3] gh-109956: Also test `typing.NamedTuple` with `copy.replace` --- Lib/test/test_copy.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index c66c6eeb00811e..6d1d2b582a6f2f 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -936,14 +936,22 @@ def __replace__(self, **changes): 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) + from typing import NamedTuple + PointFromCall = namedtuple('Point', 'x y', defaults=(0,)) + class PointFromInheritance(PointFromCall): + pass + class PointFromClass(NamedTuple): + x: int + y: int = 0 + for Point in (PointFromCall, PointFromInheritance, PointFromClass): + with self.subTest(Point=Point): + 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) def test_dataclass(self): from dataclasses import dataclass From 8452d949f2b8331fc82b8053f0b86d31a193fa58 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Fri, 29 Sep 2023 08:51:08 +0300 Subject: [PATCH 2/3] Address review --- Lib/test/test_copy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index 6d1d2b582a6f2f..60d7d41fdc3325 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -946,6 +946,7 @@ class PointFromClass(NamedTuple): for Point in (PointFromCall, PointFromInheritance, PointFromClass): with self.subTest(Point=Point): p = Point(11, 22) + self.assertIsInstance(p, Point) 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)) From 2e3db6ffc145b9db7d6129e8d0e018e69a9293eb Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Tue, 3 Oct 2023 13:30:18 +0300 Subject: [PATCH 3/3] Update Lib/test/test_copy.py --- Lib/test/test_copy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_copy.py b/Lib/test/test_copy.py index 60d7d41fdc3325..60735ba89a80ee 100644 --- a/Lib/test/test_copy.py +++ b/Lib/test/test_copy.py @@ -948,6 +948,7 @@ class PointFromClass(NamedTuple): p = Point(11, 22) self.assertIsInstance(p, Point) self.assertEqual(copy.replace(p), (11, 22)) + self.assertIsInstance(copy.replace(p), Point) 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))