8000 [3.10] gh-102721: Improve coverage of `_collections_abc._CallableGene… · python/cpython@e732a85 · GitHub
[go: up one dir, main page]

Skip to content

Commit e732a85

Browse files
authored
[3.10] gh-102721: Improve coverage of _collections_abc._CallableGenericAlias (GH-102790)
This is a manual backport of #102722 but without `typing.py` changes and without `TypeVarTuple` case, because it was added in 3.11 Automerge-Triggered-By: GH:AlexWaygood
1 parent 744a41b commit e732a85

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

Lib/test/test_typing.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -556,14 +556,27 @@ def test_weakref(self):
556556
self.assertEqual(weakref.ref(alias)(), alias)
557557

558558
def test_pickle(self):
559+
global T_pickle, P_pickle # needed for pickling
559560
Callable = self.Callable
560-
alias = Callable[[int, str], float]
561-
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
562-
s = pickle.dumps(alias, proto)
563-
loaded = pickle.loads(s)
564-
self.assertEqual(alias.__origin__, loaded.__origin__)
565-
self.assertEqual(alias.__args__, loaded.__args__)
566-
self.assertEqual(alias.__parameters__, loaded.__parameters__)
561+
T_pickle = TypeVar('T_pickle')
562+
P_pickle = ParamSpec('P_pickle')
563+
564+
samples = [
565+
Callable[[int, str], float],
566+
Callable[P_pickle, int],
567+
Callable[P_pickle, T_pickle],
568+
Callable[Concatenate[int, P_pickle], int],
569+
]
570+
for alias in samples:
571+
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
572+
with self.subTest(alias=alias, proto=proto):
573+
s = pickle.dumps(alias, proto)
574+
loaded = pickle.loads(s)
575+
self.assertEqual(alias.__origin__, loaded.__origin__)
576+
self.assertEqual(alias.__args__, loaded.__args__)
577+
self.assertEqual(alias.__parameters__, loaded.__parameters__)
578+
579+
del T_pickle, P_pickle # cleaning up global state
567580

568581
def test_var_substitution(self):
569582
Callable = self.Callable
@@ -590,6 +603,16 @@ def test_var_substitution(self):
590603
self.assertEqual(C5[int, str, float],
591604
Callable[[typing.List[int], tuple[str, int], float], int])
592605

606+
def test_type_subst_error(self):
607+
Callable = self.Callable
608+
P = ParamSpec('P')
609+
T = TypeVar('T')
610+
611+
pat = "Expected a list of types, an ellipsis, ParamSpec, or Concatenate."
612+
613+
with self.assertRaisesRegex(TypeError, pat):
614+
Callable[P, T][0, int]
615+
593616
def test_type_erasure(self):
594617
Callable = self.Callable
595618
class C1(Callable):

0 commit comments

Comments
 (0)
0