Определение класса == работает, но! = Не работает - PullRequest
1 голос
/ 29 апреля 2019

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

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__().У меня никогда не было проблем до сих пор, и я не могу понять, почему это не работает ...

Ответы [ 2 ]

5 голосов
/ 29 апреля 2019
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)
1 голос
/ 29 апреля 2019

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

return not self.__eq__(self, other)

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

return not self.__eq__(other)
...