Определение класса == работает, но != нет

Рассмотрим следующий минимальный пример:

class Dummy:
    def __init__(self, v1, v2, v3):
        self.v1 = v1
        self.v2 = v2
        self.v3 = v3

    def __key(self):
        return (self.v1, self.v2, self.v3)

    def __hash__(self):
        return hash(self.__key())

    def __eq__(self, other):
        """ == comparison method."""
        return isinstance(self, type(other)) and self.__key() == other.__key()

    def __ne__(self, other):
        """ != comparison method."""
        return not self.__eq__(self, other)

D1 = Dummy(1, 2, 3)
D2 = Dummy(1, 4, 5)

Если я попробую D1 == D2, я получу False. Однако, если я попробую D1 != D2, я получу:

D1 != D2
Traceback (most recent call last):

  File "<ipython-input-3-82e7c8b040e3>", line 1, in <module>
    D1 != D2

  File "<ipython-input-1-34c16f7f1c83>", line 19, in __ne__
    return not self.__eq__(self, other)

TypeError: __eq__() takes 2 positional arguments but 3 were given

Я всегда определял __ne__() с этим синтаксисом как not self.__eq__(). У меня никогда не было проблем до сих пор, и я не могу понять, почему это не работает...

В __ne__ должно быть self.__eq__(other) вместо self.__eq__(self, other) :)

RobinFrcd 29.04.2019 14:25

Еще одно замечание: вам В самом деле нужен этот класс? tuple, кажется, ведет себя очень близко к тому, как вы реализовали.

Reut Sharabani 29.04.2019 14:26

Спасибо всем, глупая ошибка. Этот класс является фиктивным, я оставил только основную часть для примера.

Mathieu 29.04.2019 14:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
def __ne__(self, other):
    """ != comparison method."""
    return not self.__eq__(self, other)

Вы не должны явно передавать self в self.__eq__ так же, как вы не передаете self в self._key():

def __ne__(self, other):
    """ != comparison method."""
    return not self.__eq__(other)

Глупая ошибка... Спасибо!

Mathieu 29.04.2019 14:30

Вы указали слишком много аргументов для __eq__, когда вызываете его из __ne__:

return not self.__eq__(self, other)

Должно быть на единицу меньше, потому что self передается неявно:

return not self.__eq__(other)

Другие вопросы по теме