functools.total_ordering în Python

Modulul functools Python 3.2+

Completează automat toți operatorii de comparare ai unei clase care definește doar egalitatea și unul dintre ei.

Sintaxă
@functools.total_ordering
class Clasa:
    def __eq__(self, other): ...
    def __lt__(self, other): ...

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.