PaliSkill
Python avancé

Leçon 10 / 10 — Chapitre 4: Décorateurs

Cas pratique : un décorateur de journalisation réutilisable

Cette dernière leçon combine functools.wraps, *args/**kwargs, et un décorateur avec argument, dans un décorateur de journalisation configurable.

from functools import wraps

def journaliser(niveau="INFO"):
    def decorateur(fonction):
        @wraps(fonction)
        def enveloppe(*args, **kwargs):
            print(f"[{niveau}] Appel de {fonction.__name__} avec {args} {kwargs}")
            resultat = fonction(*args, **kwargs)
            print(f"[{niveau}] {fonction.__name__} a renvoye {resultat}")
            return resultat
        return enveloppe
    return decorateur

@journaliser(niveau="DEBUG")
def diviser(a, b):
    return a / b

diviser(10, 2)

Ce que fait chaque partie :

  • journaliser(niveau="INFO") est un décorateur avec argument (vu dans ce chapitre) : il reçoit niveau, et renvoie decorateur, qui reçoit à son tour la fonction à décorer.
  • @wraps(fonction) préserve fonction.__name__ (vu dans ce chapitre), utilisé dans les messages affichés.
  • enveloppe(*args, **kwargs) accepte n'importe quelle fonction, quels que soient ses paramètres (vu dans ce chapitre), et retransmet ces arguments à fonction(*args, **kwargs).

Ce code affiche [DEBUG] Appel de diviser avec (10, 2) {}, puis [DEBUG] diviser a renvoye 5.0 : niveau="DEBUG" a été fixé à la décoration, et réutilisé dans les deux messages affichés à chaque appel de diviser.

À vous de jouer : appliquez journaliser avec un niveau différent (par exemple "ERREUR") à une autre fonction, et vérifiez que ce niveau apparaît bien dans les messages.

🔒

Continuez ce module

Débloquez les leçons restantes ainsi que la certification finale.

2 500 XOF / 3,81 € / 4,15 $

Débloquez les 87 leçons restantes de ce module

Votre paiement est vérifié avant l'activation de l'accès