Безопасно ли просто реализовать __lt__ для класса, который будет отсортирован? - PullRequest
25 голосов
/ 10 января 2012

Предположим, что экземпляры моего ClassA окажутся в структуре данных, и мы знаем, что sorted () будет вызываться для нее.Это чужой код, который будет вызывать sorted (), поэтому я не могу указать функцию сортировки, но могу реализовать любые подходящие методы для ClassA.

Мне кажется, что

def __lt__(self, other):

достаточно, и мне не нужно реализовывать другие пять или около того методов (qt, eq, le, ge, ne).

Достаточно ли этого?

1 Ответ

33 голосов
/ 10 января 2012

PEP 8 рекомендует против этой практики. Я также рекомендую против этого, потому что это хрупкий стиль программирования (не устойчивый к незначительным изменениям кода):

Вместо этого рассмотрите возможность использования декоратора класса functools.total_ordering для выполнения работы:

@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()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...