This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author hongweipeng
Recipients docs@python, hongweipeng
Date 2018-05-03.10:30:05
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1525343405.44.0.682650639539.issue33417@psf.upfronthosting.co.za>
In-reply-to
Content
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.
History
Date User Action Args
2018-05-03 10:30:05hongweipengsetrecipients: + hongweipeng, docs@python
2018-05-03 10:30:05hongweipengsetmessageid: <1525343405.44.0.682650639539.issue33417@psf.upfronthosting.co.za>
2018-05-03 10:30:05hongweipenglinkissue33417 messages
2018-05-03 10:30:05hongweipengcreate