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știTypeErrorlaregister. 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.