Is it safe to just implement __lt__ for a class that will be sorted?

Question:

Suppose instances of my ClassA will end up in a data structure and we know sorted() will be called on it. It’s someone else’s code that’ll call sorted() so I can’t specify a sorting function but I can implement whatever methods are appropriate on ClassA.

It appears to me that

def __lt__(self, other):

is sufficient and that I don’t need implement the other five or so methods (qt,eq,le,ge,ne).

Is this sufficient?

Asked By: Matthew Lund

||

Answers:

PEP 8 recommends against this practice. I also recommend against it because it is a fragile programming style (not robust against minor code modifications):

Instead, consider using the functools.total_ordering class decorator to do the work:

@total_ordering
class Student:
    def __eq__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))
    def __lt__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))
Answered By: Raymond Hettinger
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.