Ce face functools.total_ordering
Pentru ca obiectele unei clase să poată fi sortate și comparate complet, trebuie definite șase metode speciale. Cu @total_ordering scrii doar __eq__ și una dintre __lt__, __le__, __gt__, __ge__; restul sunt generate automat.
Parametri
| Parametru | Descriere |
|---|---|
cls |
Clasa decorată. |
Ce returnează
Clasa, cu metodele de comparare completate.
Exemple
Exemplul 1: Versiuni comparabile
from functools import total_ordering
@total_ordering
class Versiune:
def __init__(self, text):
self.parti = tuple(int(p) for p in text.split("."))
def __eq__(self, other):
return self.parti == other.parti
def __lt__(self, other):
return self.parti < other.parti
def __repr__(self):
return ".".join(map(str, self.parti))
v = [Versiune("3.10.1"), Versiune("3.9.18"), Versiune("3.14.0")]
print(sorted(v))
print(Versiune("3.10") >= Versiune("3.9"), Versiune("2.7") > Versiune("3.0"))
Rezultat
[3.9.18, 3.10.1, 3.14.0]
True False
Greșeli frecvente
- Definești doar
__lt__, fără__eq__. Egalitatea rămâne cea implicită (identitatea obiectelor) și comparațiile<=dau rezultate greșite.
Comenzi înrudite
class: Definește o clasă: un șablon pentru obiecte care au date (atribute) și comportament (metode).sorted(): Returnează o listă nouă, sortată, cu elementele unei colecții.functools.cmp_to_key(): Transformă o funcție de comparare veche (care returnează negativ, zero, pozitiv) într-o cheie de sortare.