Skip to content

Commit 772d808

Browse files
authored
bpo-43224: typing: Add tests for pickling and copying of unpacked native tuple (GH-32159)
1 parent cae0f5d commit 772d808

File tree

1 file changed

+56
-17
lines changed

1 file changed

+56
-17
lines changed

Lib/test/test_genericalias.py

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,44 @@
4747
from queue import Queue, SimpleQueue
4848
from weakref import WeakSet, ReferenceType, ref
4949
import typing
50+
from typing import Unpack
5051

5152
from typing import TypeVar
5253
T = TypeVar('T')
5354
K = TypeVar('K')
5455
V = TypeVar('V')
5556

57+
_UNPACKED_TUPLES = [
58+
# Unpacked tuple using `*`
59+
(*tuple[int],)[0],
60+
(*tuple[T],)[0],
61+
(*tuple[int, str],)[0],
62+
(*tuple[int, ...],)[0],
63+
(*tuple[T, ...],)[0],
64+
tuple[*tuple[int, ...]],
65+
tuple[*tuple[T, ...]],
66+
tuple[str, *tuple[int, ...]],
67+
tuple[*tuple[int, ...], str],
68+
tuple[float, *tuple[int, ...], str],
69+
tuple[*tuple[*tuple[int, ...]]],
70+
# Unpacked tuple using `Unpack`
71+
Unpack[tuple[int]],
72+
Unpack[tuple[T]],
73+
Unpack[tuple[int, str]],
74+
Unpack[tuple[int, ...]],
75+
Unpack[tuple[T, ...]],
76+
tuple[Unpack[tuple[int, ...]]],
77+
tuple[Unpack[tuple[T, ...]]],
78+
tuple[str, Unpack[tuple[int, ...]]],
79+
tuple[Unpack[tuple[int, ...]], str],
80+
tuple[float, Unpack[tuple[int, ...]], str],
81+
tuple[Unpack[tuple[Unpack[tuple[int, ...]]]]],
82+
# Unpacked tuple using `*` AND `Unpack`
83+
tuple[Unpack[tuple[*tuple[int, ...]]]],
84+
tuple[*tuple[Unpack[tuple[int, ...]]]],
85+
]
86+
87+
5688
class BaseTest(unittest.TestCase):
5789
"""Test basics."""
5890
generic_types = [type, tuple, list, dict, set, frozenset, enumerate,
@@ -351,13 +383,15 @@ class MyType(type):
351383
MyType[int]
352384

353385
def test_pickle(self):
354-
alias = GenericAlias(list, T)
355-
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
356-
s = pickle.dumps(alias, proto)
357-
loaded = pickle.loads(s)
358-
self.assertEqual(loaded.__origin__, alias.__origin__)
359-
self.assertEqual(loaded.__args__, alias.__args__)
360-
self.assertEqual(loaded.__parameters__, alias.__parameters__)
386+
aliases = [GenericAlias(list, T)] + _UNPACKED_TUPLES
387+
for alias in aliases:
388+
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
389+
with self.subTest(alias=alias, proto=proto):
390+
s = pickle.dumps(alias, proto)
391+
loaded = pickle.loads(s)
392+
self.assertEqual(loaded.__origin__, alias.__origin__)
393+
self.assertEqual(loaded.__args__, alias.__args__)
394+
self.assertEqual(loaded.__parameters__, alias.__parameters__)
361395

362396
def test_copy(self):
363397
class X(list):
@@ -366,16 +400,21 @@ def __copy__(self):
366400
def __deepcopy__(self, memo):
367401
return self
368402

369-
for origin in list, deque, X:
370-
alias = GenericAlias(origin, T)
371-
copied = copy.copy(alias)
372-
self.assertEqual(copied.__origin__, alias.__origin__)
373-
self.assertEqual(copied.__args__, alias.__args__)
374-
self.assertEqual(copied.__parameters__, alias.__parameters__)
375-
copied = copy.deepcopy(alias)
376-
self.assertEqual(copied.__origin__, alias.__origin__)
377-
self.assertEqual(copied.__args__, alias.__args__)
378-
self.assertEqual(copied.__parameters__, alias.__parameters__)
403+
aliases = [
404+
GenericAlias(list, T),
405+
GenericAlias(deque, T),
406+
GenericAlias(X, T)
407+
] + _UNPACKED_TUPLES
408+
for alias in aliases:
409+
with self.subTest(alias=alias):
410+
copied = copy.copy(alias)
411+
self.assertEqual(copied.__origin__, alias.__origin__)
412+
self.assertEqual(copied.__args__, alias.__args__)
413+
self.assertEqual(copied.__parameters__, alias.__parameters__)
414+
copied = copy.deepcopy(alias)
415+
self.assertEqual(copied.__origin__, alias.__origin__)
416+
self.assertEqual(copied.__args__, alias.__args__)
417+
self.assertEqual(copied.__parameters__, alias.__parameters__)
379418

380419
def test_union(self):
381420
a = typing.Union[list[int], list[str]]

0 commit comments

Comments
 (0)