From 06a619b686504d67cdc0bd369c05f9b7bf2eb714 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Fri, 17 Mar 2023 22:17:16 +0300 Subject: [PATCH 1/3] [3.10] gh-102721: Improve coverage of `_collections_abc._CallableGenericAlias` --- Lib/test/test_typing.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index a4d243400d179a..dd2502a3474b74 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -556,14 +556,27 @@ def test_weakref(self): self.assertEqual(weakref.ref(alias)(), alias) def test_pickle(self): + global T_pickle, P_pickle # needed for pickling Callable = self.Callable - alias = Callable[[int, str], float] - for proto in range(pickle.HIGHEST_PROTOCOL + 1): - s = pickle.dumps(alias, proto) - loaded = pickle.loads(s) - self.assertEqual(alias.__origin__, loaded.__origin__) - self.assertEqual(alias.__args__, loaded.__args__) - self.assertEqual(alias.__parameters__, loaded.__parameters__) + T_pickle = TypeVar('T_pickle') + P_pickle = ParamSpec('P_pickle') + + samples = [ + Callable[[int, str], float], + Callable[P_pickle, int], + Callable[P_pickle, T_pickle], + Callable[Concatenate[int, P_pickle], int], + ] + for alias in samples: + 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(alias.__origin__, loaded.__origin__) + self.assertEqual(alias.__args__, loaded.__args__) + self.assertEqual(alias.__parameters__, loaded.__parameters__) + + del T_pickle, P_pickle # cleaning up global state def test_var_substitution(self): Callable = self.Callable From 0736c9a4584ca732b09176cc638d115ba383f7f6 Mon Sep 17 00:00:00 2001 From: Nikita Sobolev Date: Fri, 17 Mar 2023 22:24:41 +0300 Subject: [PATCH 2/3] Update test_typing.py --- Lib/test/test_typing.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index dd2502a3474b74..deea9cd7621eb8 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -603,6 +603,16 @@ def test_var_substitution(self): self.assertEqual(C5[int, str, float], Callable[[typing.List[int], tuple[str, int], float], int]) + def test_type_subst_error(self): + Callable = self.Callable + P = ParamSpec('P') + T = TypeVar('T') + + pat = "Expected a list of types, an ellipsis, ParamSpec, or Concatenate." + + with self.assertRaisesRegex(TypeError, pat): + Callable[P, T][0, int] + def test_type_erasure(self): Callable = self.Callable class C1(Callable): From 0d00d46eb778e30a2be3b75160ebc183742eeecd Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Fri, 17 Mar 2023 19:49:02 +0000 Subject: [PATCH 3/3] Update Lib/test/test_typing.py Co-authored-by: Eclips4 <80244920+Eclips4@users.noreply.github.com> --- Lib/test/test_typing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index deea9cd7621eb8..68dfedfb6a0dea 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -603,7 +603,7 @@ def test_var_substitution(self): self.assertEqual(C5[int, str, float], Callable[[typing.List[int], tuple[str, int], float], int]) - def test_type_subst_error(self): + def test_type_subst_error(self): Callable = self.Callable P = ParamSpec('P') T = TypeVar('T')