bpo-44632: Fix support of TypeVar in the union type (GH-27139)

int | TypeVar('T') returns now an instance of types.Union
instead of typing.Union.
This commit is contained in:
Serhiy Storchaka 2021-07-14 20:09:15 +03:00 committed by GitHub
parent b81cac0560
commit a158b20019
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 2 deletions

View File

@ -769,6 +769,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]
@ -805,13 +806,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):

View File

@ -127,7 +127,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 *