From 40472dd42de4f7265d456458cd13ad6894d736db Mon Sep 17 00:00:00 2001 From: jab Date: Fri, 23 Mar 2018 00:26:06 +1300 Subject: 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. --- Lib/_py_abc.py | 2 ++ Misc/ACKS | 1 + .../next/Core and Builtins/2018-03-22-23-09-06.bpo-33018.0ncEJV.rst | 3 +++ Modules/_abc.c | 5 +++++ 4 files changed, 11 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-03-22-23-09-06.bpo-33018.0ncEJV.rst diff --git a/Lib/_py_abc.py b/Lib/_py_abc.py index 6f42ef3..3c3aa8e 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 d752d8a..05932a8 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 0000000..e799e98 --- /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 8628839..7daa18e 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; -- cgit v0.12