From: jab Date: Thu, 22 Mar 2018 11:26:06 +0000 (+1300) Subject: bpo-33018: Improve issubclass() error checking and message. (GH-5944) X-Git-Tag: v3.8.0a1~2062 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=40472dd42de4f7265d456458cd13ad6894d736db;p=python bpo-33018: Improve issubclass() error checking and message. (GH-5944) This improves error message for situations when a non-class is checked w.r.t. an abstract base class. --- diff --git a/Lib/_py_abc.py b/Lib/_py_abc.py index 6f42ef32fa..3c3aa8e3d6 100644 --- a/Lib/_py_abc.py +++ b/Lib/_py_abc.py @@ -107,6 +107,8 @@ class ABCMeta(type): def __subclasscheck__(cls, subclass): """Override for issubclass(subclass, cls).""" + if not isinstance(subclass, type): + raise TypeError('issubclass() arg 1 must be a class') # Check cache if subclass in cls._abc_cache: return True diff --git a/Misc/ACKS b/Misc/ACKS index d752d8a354..05932a8d89 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -202,6 +202,7 @@ Dillon Brock Richard Brodie Michael Broghton Ammar Brohi +Josh Bronson Daniel Brotsky Jean Brouwers Gary S. Brown diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-03-22-23-09-06.bpo-33018.0ncEJV.rst b/Misc/NEWS.d/next/Core and Builtins/2018-03-22-23-09-06.bpo-33018.0ncEJV.rst new file mode 100644 index 0000000000..e799e9834a --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-03-22-23-09-06.bpo-33018.0ncEJV.rst @@ -0,0 +1,3 @@ +Improve consistency of errors raised by ``issubclass()`` when called with a +non-class and an abstract base class as the first and second arguments, +respectively. Patch by Josh Bronson. diff --git a/Modules/_abc.c b/Modules/_abc.c index 862883987f..7daa18e37e 100644 --- a/Modules/_abc.c +++ b/Modules/_abc.c @@ -569,6 +569,11 @@ _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self, PyObject *subclass) /*[clinic end generated code: output=b56c9e4a530e3894 input=1d947243409d10b8]*/ { + if (!PyType_Check(subclass)) { + PyErr_SetString(PyExc_TypeError, "issubclass() arg 1 must be a class"); + return NULL; + } + PyObject *ok, *mro = NULL, *subclasses = NULL, *result = NULL; Py_ssize_t pos; int incache;