From 1f8a9e3660ca57e72bde74c50ab92aa2f1bdad4e Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Mon, 28 Mar 2022 20:08:58 +0100 Subject: [PATCH 1/3] Add tests for pickling and copying of unpack native tuple --- Lib/test/test_genericalias.py | 55 +++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 39c56f2290bd35..48d496f0fc20d2 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -47,12 +47,44 @@ from queue import Queue, SimpleQueue from weakref import WeakSet, ReferenceType, ref import typing +from typing import Unpack from typing import TypeVar T = TypeVar('T') K = TypeVar('K') V = TypeVar('V') +_UNPACKED_TUPLES = [ + # Unpacked tuple using `*` + (*tuple[int],)[0], + (*tuple[T],)[0], + (*tuple[int, str],)[0], + (*tuple[int, ...],)[0], + (*tuple[T, ...],)[0], + tuple[*tuple[int, ...]], + tuple[*tuple[T, ...]], + tuple[str, *tuple[int, ...]], + tuple[*tuple[int, ...], str], + tuple[float, *tuple[int, ...], str], + tuple[*tuple[*tuple[int, ...]]], + # Unpacked tuple using `Unpack` + Unpack[tuple[int]], + Unpack[tuple[T]], + Unpack[tuple[int, str]], + Unpack[tuple[int, ...]], + Unpack[tuple[T, ...]], + tuple[Unpack[tuple[int, ...]]], + tuple[Unpack[tuple[T, ...]]], + tuple[str, Unpack[tuple[int, ...]]], + tuple[Unpack[tuple[int, ...]], str], + tuple[float, Unpack[tuple[int, ...]], str], + tuple[Unpack[tuple[Unpack[tuple[int, ...]]]]], + # Unpacked tuple using `*` AND `Unpack` + tuple[Unpack[tuple[*tuple[int, ...]]]], + tuple[*tuple[Unpack[tuple[int, ...]]]], +] + + class BaseTest(unittest.TestCase): """Test basics.""" generic_types = [type, tuple, list, dict, set, frozenset, enumerate, @@ -351,13 +383,14 @@ class MyType(type): MyType[int] def test_pickle(self): - alias = GenericAlias(list, T) - for proto in range(pickle.HIGHEST_PROTOCOL + 1): - s = pickle.dumps(alias, proto) - loaded = pickle.loads(s) - self.assertEqual(loaded.__origin__, alias.__origin__) - self.assertEqual(loaded.__args__, alias.__args__) - self.assertEqual(loaded.__parameters__, alias.__parameters__) + aliases = [GenericAlias(list, T)] + _UNPACKED_TUPLES + for alias in aliases: + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + s = pickle.dumps(alias, proto) + loaded = pickle.loads(s) + self.assertEqual(loaded.__origin__, alias.__origin__) + self.assertEqual(loaded.__args__, alias.__args__) + self.assertEqual(loaded.__parameters__, alias.__parameters__) def test_copy(self): class X(list): @@ -366,8 +399,12 @@ def __copy__(self): def __deepcopy__(self, memo): return self - for origin in list, deque, X: - alias = GenericAlias(origin, T) + aliases = [ + GenericAlias(list, T), + GenericAlias(deque, T), + GenericAlias(X, T) + ] + _UNPACKED_TUPLES + for alias in aliases: copied = copy.copy(alias) self.assertEqual(copied.__origin__, alias.__origin__) self.assertEqual(copied.__args__, alias.__args__) From 735a5449a2e3c85bed9228a5e05b0f1384645c0b Mon Sep 17 00:00:00 2001 From: Matthew Rahtz Date: Mon, 28 Mar 2022 21:49:25 +0100 Subject: [PATCH 2/3] Use subTest --- Lib/test/test_genericalias.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 48d496f0fc20d2..9c6380a1e88641 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -385,12 +385,13 @@ class MyType(type): def test_pickle(self): aliases = [GenericAlias(list, T)] + _UNPACKED_TUPLES for alias in aliases: - for proto in range(pickle.HIGHEST_PROTOCOL + 1): - s = pickle.dumps(alias, proto) - loaded = pickle.loads(s) - self.assertEqual(loaded.__origin__, alias.__origin__) - self.assertEqual(loaded.__args__, alias.__args__) - self.assertEqual(loaded.__parameters__, alias.__parameters__) + with self.subTest(alias=alias): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + s = pickle.dumps(alias, proto) + loaded = pickle.loads(s) + self.assertEqual(loaded.__origin__, alias.__origin__) + self.assertEqual(loaded.__args__, alias.__args__) + self.assertEqual(loaded.__parameters__, alias.__parameters__) def test_copy(self): class X(list): @@ -405,14 +406,15 @@ def __deepcopy__(self, memo): GenericAlias(X, T) ] + _UNPACKED_TUPLES for alias in aliases: - copied = copy.copy(alias) - self.assertEqual(copied.__origin__, alias.__origin__) - self.assertEqual(copied.__args__, alias.__args__) - self.assertEqual(copied.__parameters__, alias.__parameters__) - copied = copy.deepcopy(alias) - self.assertEqual(copied.__origin__, alias.__origin__) - self.assertEqual(copied.__args__, alias.__args__) - self.assertEqual(copied.__parameters__, alias.__parameters__) + with self.subTest(alias=alias): + copied = copy.copy(alias) + self.assertEqual(copied.__origin__, alias.__origin__) + self.assertEqual(copied.__args__, alias.__args__) + self.assertEqual(copied.__parameters__, alias.__parameters__) + copied = copy.deepcopy(alias) + self.assertEqual(copied.__origin__, alias.__origin__) + self.assertEqual(copied.__args__, alias.__args__) + self.assertEqual(copied.__parameters__, alias.__parameters__) def test_union(self): a = typing.Union[list[int], list[str]] From 37845dd4255925a4750b53f6359df4094c4741f6 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Mon, 4 Apr 2022 18:10:16 -0700 Subject: [PATCH 3/3] Update Lib/test/test_genericalias.py --- Lib/test/test_genericalias.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_genericalias.py b/Lib/test/test_genericalias.py index 9c6380a1e88641..bf96ba065fbb04 100644 --- a/Lib/test/test_genericalias.py +++ b/Lib/test/test_genericalias.py @@ -385,8 +385,8 @@ class MyType(type): def test_pickle(self): aliases = [GenericAlias(list, T)] + _UNPACKED_TUPLES for alias in aliases: - with self.subTest(alias=alias): - for proto in range(pickle.HIGHEST_PROTOCOL + 1): + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(alias=alias, proto=proto): s = pickle.dumps(alias, proto) loaded = pickle.loads(s) self.assertEqual(loaded.__origin__, alias.__origin__)