bpo-42195: Disallow isinstance/issubclass for subclasses of genericaliases in Union (GH-24059)

Previously this didn't raise an error. Now it will:
```python
from collections.abc import Callable
isinstance(int, list | Callable[..., str])
```
Also added tests in Union since there were previously none for stuff like ``isinstance(list, list | list[int])`` either.

Backport to 3.9 not required.

Automerge-Triggered-By: GH:gvanrossum
This commit is contained in:
Ken Jin 2021-01-03 00:19:15 +08:00 committed by GitHub
parent d9142831ba
commit 49cd68fb1e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 1 deletions

View File

@ -737,6 +737,16 @@ class TypesTests(unittest.TestCase):
with self.assertRaises(ZeroDivisionError): with self.assertRaises(ZeroDivisionError):
list[int] | list[bt] list[int] | list[bt]
union_ga = (int | list[str], int | collections.abc.Callable[..., str],
int | d)
# Raise error when isinstance(type, type | genericalias)
for type_ in union_ga:
with self.subTest(f"check isinstance/issubclass is invalid for {type_}"):
with self.assertRaises(TypeError):
isinstance(list, type_)
with self.assertRaises(TypeError):
issubclass(list, type_)
def test_ellipsis_type(self): def test_ellipsis_type(self):
self.assertIsInstance(Ellipsis, types.EllipsisType) self.assertIsInstance(Ellipsis, types.EllipsisType)

View File

@ -34,7 +34,7 @@ is_generic_alias_in_args(PyObject *args) {
Py_ssize_t nargs = PyTuple_GET_SIZE(args); Py_ssize_t nargs = PyTuple_GET_SIZE(args);
for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) { for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) {
PyObject *arg = PyTuple_GET_ITEM(args, iarg); PyObject *arg = PyTuple_GET_ITEM(args, iarg);
if (Py_TYPE(arg) == &Py_GenericAliasType) { if (PyObject_TypeCheck(arg, &Py_GenericAliasType)) {
return 0; return 0;
} }
} }