summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorNikita Sobolev <mail@sobolevn.me>2023-03-17 20:11:58 (GMT)
committerGitHub <noreply@github.com>2023-03-17 20:11:58 (GMT)
commite732a859340353e982c69a80b753830756ee85bf (patch)
tree565ca422f9426bc9eb78cf4609cb2c70a2ff6201 /Lib
parent744a41bf4963a5346f43ec8632a8becb5c0112e2 (diff)
downloadcpython-e732a859340353e982c69a80b753830756ee85bf.zip
cpython-e732a859340353e982c69a80b753830756ee85bf.tar.gz
cpython-e732a859340353e982c69a80b753830756ee85bf.tar.bz2
[3.10] gh-102721: Improve coverage of `_collections_abc._CallableGenericAlias` (GH-102790)
This is a manual backport of https://github.com/python/cpython/pull/102722 but without `typing.py` changes and without `TypeVarTuple` case, because it was added in 3.11 Automerge-Triggered-By: GH:AlexWaygood
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_typing.py37
1 files changed, 30 insertions, 7 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index a4d2434..68dfedf 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -556,14 +556,27 @@ class BaseCallableTests:
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
@@ -590,6 +603,16 @@ class BaseCallableTests:
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):