pythoncomparisonoperatorsinequalitypython-datamodel

Should __ne__ be implemented as the negation of __eq__?


I have a class where I want to override the __eq__ method. It seems to make sense that I should override the __ne__ method as well. Should I implement __ne__ as the negation of __eq__ as such or is it a bad idea?

class A:

    def __init__(self, state):
        self.state = state

    def __eq__(self, other):
        return self.state == other.state

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

Solution

  • Yes, that's perfectly fine. In fact, the documentation urges you to define __ne__ when you define __eq__:

    There are no implied relationships among the comparison operators. The truth of x==y does not imply that x!=y is false. Accordingly, when defining __eq__(), one should also define __ne__() so that the operators will behave as expected.

    In a lot of cases (such as this one), it will be as simple as negating the result of __eq__, but not always.