Почему именно это решение было принято, знает только автор оригинала, но, учитывая эти подсказки из соображений руководства, можно сделать вывод:
Чтобы автоматически генерировать операции заказа из одной операции root, см. functools.total_ordering()
.
Хотя этот декоратор позволяет легко создавать хорошо упорядоченные полностью упорядоченные типы, он делает за счет более медленных выполнение и более сложные трассировки стека для производных методов сравнения. Если сравнительный анализ производительности показывает, что это является узким местом для данного приложения, реализация всех шести богатых методов сравнения, скорее всего, обеспечит легкое повышение скорости.
Сопоставьте это с мантрой Python явный лучше, чем неявный , следующие рассуждения должны быть удовлетворительными:
Получение __ne__
из __eq__
практически свободно, это просто операция not o.__eq__(other)
, то есть инвертирование логического значения.
Однако получение __le__
из объединения __lt__
и __eq__
означает, что необходимо вызвать оба метода, что может привести к потенциально значительному снижению производительности, если сравнение будет достаточно сложным, особенно для по сравнению с оптимизированной единственной реализацией __le__
. Python позволяет явно включить это удобство и производительность с помощью декоратора total_ordering
, но это не будет косвенно накладывать на вас.
Вы также можете выступать за явные ошибки, если пытаетесь выполнять неосуществленные сравнения вместо неявного получения d Сравнения, которые вы не реализовали и которые могут создавать незначительные ошибки, в зависимости от того, что вы имели в виду , чтобы сделать с вашими пользовательскими классами. Python здесь не будет давать никаких предположений, а вместо этого предоставит вам возможность либо явным образом реализовать желаемые сравнения, либо снова явным образом отказаться от производных сравнений.