все Python 3functoolsпонятие
functools.total_ordering
сравнение
Декоратор класса. Дополняет недостающие операторы сравнения (<, <=, >, >=) при наличии __eq__ и хотя бы одного из них.
Синтаксис
@functools.total_ordering
Как только вы объявили __eq__, класс теряет унаследованный __hash__ и экземпляры перестают быть хешируемыми — total_ordering это не чинит, __hash__ придётся вернуть вручную. Сгенерированные операторы просто дёргают ваши __eq__ и __lt__, поэтому работают медленнее написанных руками и удлиняют трейсбек; на горячем пути дешевле расписать все шесть. И пусть ваш __lt__ возвращает NotImplemented для чужих типов, иначе сравнение с посторонним объектом упадёт с AttributeError вместо внятного TypeError.
Примеры
from functools import total_ordering
@total_ordering
class Version:
def __init__(self, v): self.v = v
def __eq__(self, o): return self.v == o.v
def __lt__(self, o): return self.v < o.v
v1, v2 = Version(1), Version(2)
print(v1 < v2) # → True
print(v1 > v2) # → False
print(v1 <= v1) # → True
print(v2 >= v1) # → True
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности