Serhiy Storchaka added the comment:
The current status:
* Decimal and Fraction are no longer automatically converted to int when pass to functions implemented in C. PyLong_AsLong() etc no longer call __int__. (see issue36048 and issue37999)
* operator.index() and PyNumber_Index() always return an instance of exact type int. (see issue40792)
* int() and PyNumber_Long() always return an instance of exact type int. (see issue26984)
* __index__ is used as a fallback if __int__ is not defined. (see issue20092)
But:
* __index__ and __int__ are not called for int subclasses in operator.index() and int() (also in the C API PyNumber_Index(), PyNumber_Long(), PyLong_AsLong(), etc).
* Instances of int sublasses are accepted as result of __index__ and __int__ (but it is deprecated).
* The Python implementation of operator.index() differs from the C implementation in many ways. (see issue18712)
What I prefer as solutions of the remaining issues:
* It is good to not call __index__ and __int__ for int subclasses. __index__ and __int__ were designed for converting non-integers to int. There are no good use cases for overriding __index__ and __int__ in int subclasses, and calling them is just a waste of time. We should just document this behavior.
* Undeprecate accepting __index__ and __int__ returning instances of int sublasses. There is no difference from the side of using int and index(), but it can simplify user implementations of __index__ and __int__.
* Either sync the pure Python implementation of operator.index() with the C implementation or get rid of Python implementation of the operator module at all.
----------
_______________________________________
Python tracker
https://bugs.python.org/issue17576
_______________________________________