Рассмотрим следующий минимальный пример:
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__(). У меня никогда не было проблем до сих пор, и я не могу понять, почему это не работает...
Еще одно замечание: вам В самом деле нужен этот класс? tuple, кажется, ведет себя очень близко к тому, как вы реализовали.
Спасибо всем, глупая ошибка. Этот класс является фиктивным, я оставил только основную часть для примера.






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)
Глупая ошибка... Спасибо!
Вы указали слишком много аргументов для __eq__, когда вызываете его из __ne__:
return not self.__eq__(self, other)
Должно быть на единицу меньше, потому что self передается неявно:
return not self.__eq__(other)
В
__ne__должно бытьself.__eq__(other)вместоself.__eq__(self, other):)