Подтвердить что ты не робот

В чем разница между методами __int__ и __index__ в Python 3?

Раздел "Модель данных" документации Python 3.2 содержит следующие описания методов __int__ и __index__:

object.__int__(self)

Вызывается для реализации встроенной функции [function int()]. Должно возвращать [целое число].

object.__index__(self)

Вызывается operator.index(). Также вызывается всякий раз, когда Python нуждается в целочисленном объекте (например, при нарезке или во встроенных функциях bin(), hex() и oct()). Необходимо вернуть целое число.

Я понимаю, что они используются для разных целей, но я не мог понять, почему нужны два разных метода. В чем разница между этими методами? Является ли безопасным только псевдоним __index__ = __int__ в моих классах?

4b9b3361

Ответ 1

См. PEP 357: разрешить использование любого объекта для нарезки.

Метод nb_int используется для принуждения и поэтому означает что-то принципиально отличающийся от того, что запрашивается здесь. Этот PEP предлагает метод для того, что уже можно представить себе как целое число передает эту информацию на Python, когда она нуждается в целое число. Самый большой пример того, почему использование nb_int будет плохой Дело в том, что объекты float уже определяют метод nb_int, но float объекты не должны использоваться как индексы в последовательности.

Изменить: похоже, что он был реализован в Python 2.5.

Ответ 2

Я верю, что вы найдете ответ в PEP 357, который имеет этот реферат:

Этот PEP предлагает добавить nb_index слот в PyNumberMethods и __index__ специальный метод, позволяющий использовать произвольные объекты когда целые числа явно необходимы в Python, например, в срезе синтаксис (из которого слот получает свое имя).