[issue33417] Isinstance() behavior is not consistent with the document
![](https://secure.gravatar.com/avatar/fa0f7819f1825f596b384c19aa7dcf33.jpg?s=120&d=mm&r=g)
New submission from weapon <hongweichen8888@sina.com>: In the PEP 3119(https://www.python.org/dev/peps/pep-3119/),it introduce about Customizing instance and subclass checks.
The primary mechanism proposed here is to allow overloading the built-in functions isinstance() and issubclass(). The overloading works as follows: The call isinstance(x, C) first checks whether C.__instancecheck__ exists, and if so, calls C.__instancecheck__(x) instead of its normal implementation.
but my code doesn't works. ``` class Sizeable(object): def __instancecheck__(cls, instance): print("__instancecheck__ call") return hasattr(instance, "__len__") class B(object): pass b = B() print(isinstance(b, Sizeable)) # output:False ``` The __instancecheck__ function is not called. In PyObject_IsInstance,when isinstance(x, C) the following three conditions are reached, __instancecheck__ will take effect: 1. x can not be directly instantiated by C; 2. The C class specifies the metaclass; 3. The __instancecheck__ in the specified metaclass class is defined. This code can work: ``` class MetaSizeable(type): def __instancecheck__(cls, instance): print("__instancecheck__ call") return hasattr(instance, "__len__") class Sizeable(metaclass=MetaSizeable): pass class B(object): pass b = B() print(isinstance(b, Sizeable)) # output: False print(isinstance([], Sizeable)) # output: True ``` So,the problem is that the document does not conform to the reality.Can it be guaranteed that __instancecheck__ is always called? If yes: PyObject_IsInstance should be tweaked. If no: document should be tweaked. ---------- assignee: docs@python components: Documentation, Interpreter Core messages: 316118 nosy: docs@python, hongweipeng priority: normal severity: normal status: open title: Isinstance() behavior is not consistent with the document type: behavior versions: Python 3.7 _______________________________________ Python tracker <report@bugs.python.org> <https://bugs.python.org/issue33417> _______________________________________
![](https://secure.gravatar.com/avatar/fa0f7819f1825f596b384c19aa7dcf33.jpg?s=120&d=mm&r=g)
Terry J. Reedy <tjreedy@udel.edu> added the comment: https://docs.python.org/3/reference/datamodel.html#customizing-instance-and-... says "Note that these methods are looked up on the type (metaclass) of a class. They cannot be defined as class methods in the actual class. This is consistent with the lookup of special methods that are called on instances, only in this case the instance is itself a class." IE, your first example is documented as wrong. Your second example, which works, follows the example in https://docs.python.org/3/reference/datamodel.html#customizing-instance-and-... ---------- nosy: +terry.reedy resolution: -> not a bug stage: -> resolved status: open -> closed versions: +Python 3.8 _______________________________________ Python tracker <report@bugs.python.org> <https://bugs.python.org/issue33417> _______________________________________
participants (2)
-
Terry J. Reedy
-
weapon