2012-01-10 3 views
20

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

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

def __lt__(self, other): 

достаточно, и что мне не нужно выполнять другие пять или около методов (кварты, эк, ль, Г, п).

Этого достаточно?

ответ

27

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())) 
+0

Спасибо, это прекрасно! –

+1

Сортировка Python * * документирована как использующая только '__lt __()', только для записи, но проверка на будущее - это хорошо. Я не знал об этом! – kindall

+1

@kindall Получил ли вы это от моего руководства по сортировке? Просьба предоставить ссылку, чтобы я мог редактировать документы, чтобы быть более четкими, чтобы не полагаться на \ _ \ _ lt \ _ \ _. –

Смежные вопросы