functools.singledispatch și singledispatchmethod în Python

Modulul functools Python 3.4+ (singledispatchmethod: 3.8+)

Funcții generice: alegi automat implementarea după tipul primului argument.

Sintaxă
@functools.singledispatch
def functie(arg): ...

@functie.register
def _(arg: int): ...

Ce face functools.singledispatch și singledispatchmethod

@singledispatch transformă o funcție într-una generică. Implementarea de bază se folosește pentru tipurile necunoscute, iar cu @functie.register adaugi variante pentru tipuri specifice (tipul se ia din adnotarea parametrului). La apel, Python alege varianta după tipul primului argument.

singledispatchmethod face același lucru pentru metodele unei clase, ținând cont de self.

Parametri

Parametru Descriere
func Implementarea implicită.

Ce returnează

O funcție generică, cu metoda register.

Exemple

Exemplul 1: Formatare după tip

from functools import singledispatch, singledispatchmethod

@singledispatch
def descrie(x):
    return f"valoare: {x!r}"

@descrie.register
def _(x: int):
    return f"număr întreg cu {len(str(abs(x)))} cifre"

@descrie.register
def _(x: list):
    return f"listă cu {len(x)} elemente"

for v in [12345, [1, 2], "text", 3.5]:
    print(descrie(v))

class Afisor:
    @singledispatchmethod
    def arata(self, x):
        return "altceva"
    @arata.register
    def _(self, x: str):
        return "text: " + x

print(Afisor().arata("salut"), Afisor().arata(3))

Rezultat

număr întreg cu 5 cifre
listă cu 2 elemente
valoare: 'text'
valoare: 3.5
text: salut altceva

Greșeli frecvente

  • Uiți adnotarea de tip la funcția înregistrată (def _(x):) și primești TypeError la register. Adaugă tipul sau scrie @descrie.register(int).

Comenzi înrudite

  • isinstance() și issubclass(): Verifică dacă un obiect este de un anumit tip, sau dacă o clasă moștenește alta.
  • match / case: Compară o valoare cu mai multe modele (pattern matching), ca un switch mult mai puternic.
  • def: Definește o funcție: un bloc de cod cu nume, pe care îl poți apela de oricâte ori.