Почему оператор Python!= Считает, что аргументы равны и не равны одновременно?

Возьмите следующий пример:

>>> class C(object):
...     def __init__(self, p):
...         self.p = p
...     def __eq__(self, o):
...         return True
... 
>>> C(1) is C(2)
False
>>> C(1) == C(2)
True
>>> C(1) != C(2)
True # <- Why?!?

Итак, теперь два объекта равны и не равны одновременно. Я хоть две операции противостоим?!

3 ответа

Решение

Модель данных Python объясняет все это:

Не существует никаких подразумеваемых отношений между операторами сравнения. Правда о x==y не означает, что x!=y ложно Соответственно при определении __eq__()следует также определить __ne__() так что операторы будут вести себя как положено.

В C(1) != C(2)он использует реализацию по умолчанию, где объекты равны только себе и неравны всем остальным.

определяющий __cmp__ может быть проще, так как используется как запасной вариант для всех операций сравнения, а не только для некоторых из них:

...   def __cmp__(self, o):
...     return 0
>>> C(1) != C(2)
False

Есть отдельная функция для != который __ne__ который неявно определяется для сравнения членов экземпляра.

Что вы хотите сделать, это:

def __ne__(self, other):
    return not self.__eq__(other)

или какой-то вариант этого.

Вы должны определить оба __ne__ а также __eq__, И вы, вероятно, должны рассмотреть вопрос о реализации __cmp__ тоже!

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