Tu as déjà vu @app.route dans Flask ou @classmethod.
C'est quoi ce @ ?
Un décorateur est une fonction qui prend une fonction en entrée, et renvoie une nouvelle fonction modifiée. C'est comme un emballage cadeau autour de ton code.
Exemple : Mesurer le temps d'exécution
import time
def chronometre(fonction):
def wrapper():
debut = time.time()
fonction() # On exécute la vraie fonction
fin = time.time()
print(f"La fonction a mis {fin - debut} secondes.")
return wrapper
@chronometre
def fonction_lente():
time.sleep(1)
print("Fini !")
fonction_lente()
# Affiche :
# Fini !
# La fonction a mis 1.00... secondes.
C'est ultra puissant pour ajouter du logging, de l'authentification, ou du cache sans toucher au code de la fonction originale.