Post by Andrew WangHi.
I know this thread is ancient, but I would like to know the answer
as well
( https://mail.python.org/pipermail/python-list/2006-May/413542.html).
Of course, the answer in 2015 is actually very different from the
answer in 2006, since we didn't have either Python 3 or abstract
classes back then.
The IsInstance (and IsSubclass) function documentation mentions that
they use the methods __instancecheck__ [and __subclasscheck__],
presumably to support abstract classes.
The actual implementation of TypeCheck is a macro:
PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *);
#define PyObject_TypeCheck(ob, tp) \
(Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
PyType_IsSubtype (in typeobject.c) only appears to deal with the
real types, not any abstract class methods.
So it looks like PyObject_TypeCheck/PyType_IsSubtype was originally
introduced to check for real types (and not old style classes), and
continued in that niche as IsInstance/IsSubclass were repurposed to
deal with PEP 3119 ABC logic.
Incidentally, this made me wonder what was done before
PyObject_IsInstance was added in 2.1. In 2.0, substantially the same
code exists inside builtin_isinstance.
Stuff I found researching this:
http://comments.gmane.org/gmane.comp.python.cython.devel/2928
https://groups.google.com/forum/#!topic/comp.lang.python/z594gnaBhwY
https://groups.google.com/forum/#!topic/comp.lang.python/ywqzu3JD6Nw
Post by Andrew Wangraise ob
return 1
else: return 0