<html><head><style>body{font-family:Helvetica,Arial;font-size:13px}</style></head><body><div style="font-family:Helvetica,Arial;font-size:13px"><br><div style="margin:0px">Hi, I open this thread to discuss the proposal by Nick Coghlan in <a href="https://bugs.python.org/issue33039">https://bugs.python.org/issue33039</a></div><div style="margin:0px">to add __int__ and __trunc__ to a type when __index__ is defined.</div><div style="margin:0px"><br></div><div style="margin:0px">Currently __int__ does not default to __index__ during class initialisation so</div><div style="margin:0px">both must be defined to get a coherant behavior:</div><div style="margin:0px"><br></div><div style="margin:0px">    (cpython-venv) ➜  cpython git:(add-key-argument-to-bisect) ✗ python3</div><div style="margin:0px">    Python 3.8.0a1+ (heads/add-key-argument-to-bisect:b7aaa1adad, Feb 18 2019, 16:10:22)</div><div style="margin:0px">    [Clang 10.0.0 (clang-1000.10.44.4)] on darwin</div><div style="margin:0px">    Type "help", "copyright", "credits" or "license" for more information.</div><div style="margin:0px">    >>> import math</div><div style="margin:0px">    >>> class MyInt:</div><div style="margin:0px">    ...     def __index__(self):</div><div style="margin:0px">    ...             return 4</div><div style="margin:0px">    ...</div><div style="margin:0px">    >>> int(MyInt())</div><div style="margin:0px">    Traceback (most recent call last):</div><div style="margin:0px">    File "<stdin>", line 1, in <module></div><div style="margin:0px">    TypeError: int() argument must be a string, a bytes-like object or a number, not 'MyInt'</div><div style="margin:0px">    >>> math.trunc(MyInt())</div><div style="margin:0px">    Traceback (most recent call last):</div><div style="margin:0px">    File "<stdin>", line 1, in <module></div><div style="margin:0px">    TypeError: type MyInt doesn't define __trunc__ method</div><div style="margin:0px">    >>> hex(MyInt())</div><div style="margin:0px">    '0x4'</div><div style="margin:0px">    >>> len("a"*MyInt())</div><div style="margin:0px">    4</div><div style="margin:0px">    >>> MyInt.__int__ = MyInt.__index__</div><div style="margin:0px">    >>> int(MyInt())</div><div style="margin:0px">    4</div><div style="margin:0px"><br></div><div style="margin:0px"><br></div><div style="margin:0px">The difference in behavior is espacially weird in builtins like int() and hex().</div><div style="margin:0px"><br></div><div style="margin:0px"><br></div><div style="margin:0px">The documentation mentions at <a href="https://docs.python.org/3/reference/datamodel.html#object.__index__">https://docs.python.org/3/reference/datamodel.html#object.__index__</a></div><div style="margin:0px">the need to always define both __index__ and __int__:</div><div style="margin:0px"><br></div><div style="margin:0px">    Note: In order to have a coherent integer type class, when __index__() is defined __int__() should also be defined, and both should return the same value. </div><div style="margin:0px"><br></div><div style="margin:0px">Nick Coghlan proposes to make __int__ defaults to __index__ when only the second</div><div style="margin:0px">is defined and asked to open a discussion on python-dev before making any change</div><div style="margin:0px">"as the closest equivalent we have to this right now is the "negative" derivation, </div><div style="margin:0px">where overriding __eq__ without overriding __hash__ implicitly marks the derived </div><div style="margin:0px">class as unhashable (look for "type->tp_hash = PyObject_HashNotImplemented;").".</div><div style="margin:0px"><br></div><div style="margin:0px"><br></div><div style="margin:0px">I think the change proposed makes more sense than the current behavior and </div><div style="margin:0px">volunteer to implement it if it is accepted.</div><div style="margin:0px"><br></div><div style="margin:0px"><br></div><div style="margin:0px">What do you think about this?</div></div></body></html>