diff options
author | jab <jab@users.noreply.github.com> | 2018-03-22 11:26:06 (GMT) |
---|---|---|
committer | Ivan Levkivskyi <levkivskyi@gmail.com> | 2018-03-22 11:26:06 (GMT) |
commit | 40472dd42de4f7265d456458cd13ad6894d736db (patch) | |
tree | 2e6defa875a783260642cf6fa2546f0db387b6a3 | |
parent | d93b5161af12291f3f98a260c90cc2975ea9e9cd (diff) | |
download | cpython-40472dd42de4f7265d456458cd13ad6894d736db.zip cpython-40472dd42de4f7265d456458cd13ad6894d736db.tar.gz cpython-40472dd42de4f7265d456458cd13ad6894d736db.tar.bz2 |
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.
-rw-r--r-- | Lib/_py_abc.py | 2 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2018-03-22-23-09-06.bpo-33018.0ncEJV.rst | 3 | ||||
-rw-r--r-- | Modules/_abc.c | 5 |
4 files changed, 11 insertions, 0 deletions
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 @@ -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; |