summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKen Jin <28750310+Fidget-Spinner@users.noreply.github.com>2021-01-02 16:19:15 (GMT)
committerGitHub <noreply@github.com>2021-01-02 16:19:15 (GMT)
commit49cd68fb1ed4cbaf109308c0a7c8c1efcf6f3775 (patch)
tree4a32be22ada611677a3d9f86b5c1e1215aac3dcd
parentd9142831ba6780eef47bb68e878cf2f8910c4ab2 (diff)
downloadcpython-49cd68fb1ed4cbaf109308c0a7c8c1efcf6f3775.zip
cpython-49cd68fb1ed4cbaf109308c0a7c8c1efcf6f3775.tar.gz
cpython-49cd68fb1ed4cbaf109308c0a7c8c1efcf6f3775.tar.bz2
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
-rw-r--r--Lib/test/test_types.py10
-rw-r--r--Objects/unionobject.c2
2 files changed, 11 insertions, 1 deletions
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 83196ad..d8a48ce 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -737,6 +737,16 @@ class TypesTests(unittest.TestCase):
with self.assertRaises(ZeroDivisionError):
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):
self.assertIsInstance(Ellipsis, types.EllipsisType)
diff --git a/Objects/unionobject.c b/Objects/unionobject.c
index 32aa507..0535036 100644
--- a/Objects/unionobject.c
+++ b/Objects/unionobject.c
@@ -34,7 +34,7 @@ is_generic_alias_in_args(PyObject *args) {
Py_ssize_t nargs = PyTuple_GET_SIZE(args);
for (Py_ssize_t iarg = 0; iarg < nargs; iarg++) {
PyObject *arg = PyTuple_GET_ITEM(args, iarg);
- if (Py_TYPE(arg) == &Py_GenericAliasType) {
+ if (PyObject_TypeCheck(arg, &Py_GenericAliasType)) {
return 0;
}
}