Les décorateurs
Modifie le comportement d'une fonction avec @decorateur.
⏱ 14 minutes
📂 avance
#avance
#decorateurs
#fonctions
Les décorateurs
Un décorateur est une fonction qui enveloppe une autre fonction pour modifier son comportement, sans toucher au code d'origine.
Premier décorateur
def bavard(fonction):
def wrapper(*args, **kwargs):
print(f">>> appel de {fonction.__name__}")
resultat = fonction(*args, **kwargs)
print(f"<<< retour de {fonction.__name__}")
return resultat
return wrapper
@bavard
def saluer(nom):
print(f"Salut {nom} !")
saluer("Zazac")
# >>> appel de saluer
# Salut Zazac !
# <<< retour de saluer
@bavard est équivalent à saluer = bavard(saluer).
Mesurer le temps d'une fonction
import time
def chrono(fonction):
def wrapper(*args, **kwargs):
debut = time.time()
r = fonction(*args, **kwargs)
print(f"⏱ {fonction.__name__} a pris {time.time()-debut:.2f}s")
return r
return wrapper
@chrono
def calcul_lent():
time.sleep(1)
return 42
calcul_lent()
# ⏱ calcul_lent a pris 1.00s
Préserver les métadonnées avec wraps
Sans précaution, le décorateur "écrase" le nom et la doc :
print(saluer.__name__) # wrapper ← oups !
Solution : functools.wraps :
from functools import wraps
def bavard(fonction):
@wraps(fonction)
def wrapper(*args, **kwargs):
...
return wrapper
Décorateur avec paramètres
def repeter(fois):
def decorateur(fonction):
@wraps(fonction)
def wrapper(*args, **kwargs):
for _ in range(fois):
fonction(*args, **kwargs)
return wrapper
return decorateur
@repeter(3)
def coucou():
print("Coucou !")
coucou()
# Coucou !
# Coucou !
# Coucou !
Cas concret : décorateur "login requis" (Flask-Login)
from flask_login import login_required
@app.route("/profil")
@login_required # ← décorateur fourni par Flask-Login
def profil():
return "Page secrète"
Cas concret : @property, @staticmethod, @classmethod
Tous des décorateurs fournis par Python.
💡 Une fois compris, les décorateurs sont partout dans les frameworks Python (Flask, Django, FastAPI…). Maîtrise-les bien !
🧪 Quiz de validation
Réponds à toutes les questions. Il faut 70% de bonnes réponses pour valider le tuto !
🔒 Tu dois être connecté pour passer le quiz.