Python3 - Как определить, следует ли использовать поведение __idiv__ или __div__ при перегрузке __truediv__? - PullRequest
0 голосов
/ 18 октября 2019

Я работаю над кодом, который обрабатывает / анализирует двоичные данные. Целочисленное продвижение является требованием в моей работе с различными целочисленными типами. В результате создания пользовательских целочисленных типов AND, поскольку я хочу поддерживать python2 и python3 (не подлежащие обсуждению), мне нужно перегрузить операторы __div__, __idiv__ и __truediv__.

Однако,в python3.7 я не могу сказать , почему truediv вызывается! Пример:

class NewInt(object):
    def __init__(self, value):
        self.value = value

    def __div__(self, other):
        print("DIV")
        return self.value / other

    def __idiv__(self, other):
        print("IDIV")
        self.value /= other

    def __truediv__(self, other):
        print("TRUEDIV")
        return self.value / other


test = NewInt(10)
test / 10
test /= 10

Если запустить в python2.7, я получу:

DIV
IDIV

Если запустить в python3.7, я получу:

TRUEDIV
TRUEDIV

Какузнать, когда происходит деление на месте, если вызывается только __truediv__?

1 Ответ

1 голос
/ 18 октября 2019

Вы не реализовали __itruediv__, который эквивалентен Python 3 для __idiv__.

class NewInt(object):
    def __init__(self, value):
        self.value = value

    def __truediv__(self, other):
        print("TRUEDIV")
        return self.value / other

    def __itruediv__(self, other):
        print("ITRUEDIV")
        self.value /= other

test = NewInt(10)
test / 10
test /= 10

Python 2 *.

TRUEDIV
ITRUEDIV
...