]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-44632: Fix support of TypeVar in the union type (GH-27139) (GH-27143)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 15 Jul 2021 07:25:22 +0000 (00:25 -0700)
committerGitHub <noreply@github.com>
Thu, 15 Jul 2021 07:25:22 +0000 (10:25 +0300)
int | TypeVar('T') returns now an instance of types.Union
instead of typing.Union.
(cherry picked from commit a158b20019b50e3ece6e4743ec4e6ae8d818b690)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Lib/test/test_types.py
Objects/unionobject.c

index 5254d5894b3d63328a125c2bba4b717e937eb9ae..3f7677108ef2a881d7e87c086cf646084eb6115f 100644 (file)
@@ -759,6 +759,7 @@ class TypesTests(unittest.TestCase):
         assert repr(int | None) == "int | None"
         assert repr(int | type(None)) == "int | None"
         assert repr(int | typing.GenericAlias(list, int)) == "int | list[int]"
+        assert repr(int | typing.TypeVar('T')) == "int | ~T"
 
     def test_or_type_operator_with_genericalias(self):
         a = list[int]
@@ -795,13 +796,18 @@ class TypesTests(unittest.TestCase):
                     issubclass(int, type_)
 
     def test_or_type_operator_with_bad_module(self):
-        class TypeVar:
+        class BadMeta(type):
+            __qualname__ = 'TypeVar'
             @property
             def __module__(self):
                 1 / 0
+        TypeVar = BadMeta('TypeVar', (), {})
+        _SpecialForm = BadMeta('_SpecialForm', (), {})
         # Crashes in Issue44483
         with self.assertRaises(ZeroDivisionError):
             str | TypeVar()
+        with self.assertRaises(ZeroDivisionError):
+            str | _SpecialForm()
 
     @cpython_only
     def test_or_type_operator_reference_cycle(self):
index 98db27d435727ffc605224dd634834d1ee06296b..229b518ea757569e740ae320af76d98f979252ca 100644 (file)
@@ -124,7 +124,7 @@ is_typing_name(PyObject *obj, char *name)
     if (strcmp(type->tp_name, name) != 0) {
         return 0;
     }
-    return is_typing_module(obj);
+    return is_typing_module((PyObject *)type);
 }
 
 static PyObject *