🐍 PyTutos

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.