From 856e8fd0888b284a88bacc60c824d22289af13d0 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Wed, 17 May 2023 06:08:21 -0700 Subject: [PATCH 1/2] [3.11] typing: Add more tests for TypeVar (GH-104571) During the PEP 695 implementation at one point I made TypeVar.__name__ return garbage, and all of test_typing passed. So I decided to add a few more tests. In the process I discovered a minor incompatibility from the C implementation of TypeVar: empty constraints were returned as None instead of an empty tuple.. (cherry picked from commit 26931944dd8abd6554249239344fa62b789b9028) Co-authored-by: Jelle Zijlstra --- Lib/test/test_typing.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index e46a6ca06200b1..b506665ccdb530 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -364,6 +364,32 @@ def test_basic_plain(self): self.assertEqual(T, T) # T is an instance of TypeVar self.assertIsInstance(T, TypeVar) + self.assertEqual(T.__name__, 'T') + self.assertEqual(T.__constraints__, ()) + self.assertIs(T.__bound__, None) + self.assertIs(T.__covariant__, False) + self.assertIs(T.__contravariant__, False) + + def test_attributes(self): + T_bound = TypeVar('T_bound', bound=int) + self.assertEqual(T_bound.__name__, 'T_bound') + self.assertEqual(T_bound.__constraints__, ()) + self.assertIs(T_bound.__bound__, int) + + T_constraints = TypeVar('T_constraints', int, str) + self.assertEqual(T_constraints.__name__, 'T_constraints') + self.assertEqual(T_constraints.__constraints__, (int, str)) + self.assertIs(T_constraints.__bound__, None) + + T_co = TypeVar('T_co', covariant=True) + self.assertEqual(T_co.__name__, 'T_co') + self.assertIs(T_co.__covariant__, True) + self.assertIs(T_co.__contravariant__, False) + + T_contra = TypeVar('T_contra', contravariant=True) + self.assertEqual(T_contra.__name__, 'T_contra') + self.assertIs(T_contra.__covariant__, False) + self.assertIs(T_contra.__contravariant__, True) def test_typevar_instance_type_error(self): T = TypeVar('T') @@ -454,6 +480,12 @@ def test_no_bivariant(self): with self.assertRaises(ValueError): TypeVar('T', covariant=True, contravariant=True) + def test_cannot_combine_explicit_and_infer(self): + with self.assertRaises(ValueError): + TypeVar('T', covariant=True, infer_variance=True) + with self.assertRaises(ValueError): + TypeVar('T', contravariant=True, infer_variance=True) + def test_var_substitution(self): T = TypeVar('T') subst = T.__typing_subst__ @@ -7426,6 +7458,7 @@ def test_basic_plain(self): P = ParamSpec('P') self.assertEqual(P, P) self.assertIsInstance(P, ParamSpec) + self.assertEqual(P.__name__, 'P') def test_valid_uses(self): P = ParamSpec('P') From a1496e17994f5134a2266603fb5f26bd57966689 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Wed, 17 May 2023 06:13:15 -0700 Subject: [PATCH 2/2] remove inapplicable test --- Lib/test/test_typing.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index b506665ccdb530..e36cab601621e3 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -480,12 +480,6 @@ def test_no_bivariant(self): with self.assertRaises(ValueError): TypeVar('T', covariant=True, contravariant=True) - def test_cannot_combine_explicit_and_infer(self): - with self.assertRaises(ValueError): - TypeVar('T', covariant=True, infer_variance=True) - with self.assertRaises(ValueError): - TypeVar('T', contravariant=True, infer_variance=True) - def test_var_substitution(self): T = TypeVar('T') subst = T.__typing_subst__