mirror of
https://github.com/python/cpython
synced 2026-09-29 12:10:30 +03:00
bpo-43224: typing: Add tests for pickling and copying of unpacked native tuple (GH-32159)
This commit is contained in:
parent
cae0f5d3da
commit
772d8080c9
1 changed files with 56 additions and 17 deletions
|
|
@ -47,12 +47,44 @@ from unittest.case import _AssertRaisesContext
|
|||
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,15 @@ class BaseTest(unittest.TestCase):
|
|||
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):
|
||||
with self.subTest(alias=alias, proto=proto):
|
||||
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,16 +400,21 @@ class BaseTest(unittest.TestCase):
|
|||
def __deepcopy__(self, memo):
|
||||
return self
|
||||
|
||||
for origin in list, deque, X:
|
||||
alias = GenericAlias(origin, T)
|
||||
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__)
|
||||
aliases = [
|
||||
GenericAlias(list, T),
|
||||
GenericAlias(deque, T),
|
||||
GenericAlias(X, T)
|
||||
] + _UNPACKED_TUPLES
|
||||
for alias in aliases:
|
||||
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]]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue