Comprendre les Décorateurs de Base
Dans cette étape, nous allons introduire le concept de décorateurs et leur utilisation de base. Un décorateur est une fonction qui prend une autre fonction comme argument, lui ajoute une certaine fonctionnalité et retourne une autre fonction, le tout sans modifier le code source de la fonction originale.
Tout d'abord, localisez le fichier decorator_basics.py dans l'explorateur de fichiers sur le côté gauche du WebIDE. Double-cliquez pour l'ouvrir. Nous allons écrire notre premier décorateur dans ce fichier.
Copiez et collez le code suivant dans decorator_basics.py:
import datetime
def log_activity(func):
"""A simple decorator to log function calls."""
def wrapper(*args, **kwargs):
print(f"Calling function '{func.__name__}' at {datetime.datetime.now()}")
result = func(*args, **kwargs)
print(f"Function '{func.__name__}' finished.")
return result
return wrapper
@log_activity
def greet(name):
"""A simple function to greet someone."""
print(f"Hello, {name}!")
## Call the decorated function
greet("Alice")
## Let's inspect the function's metadata
print(f"\nFunction name: {greet.__name__}")
print(f"Function docstring: {greet.__doc__}")
Décortiquons ce code :
- Nous définissons une fonction décoratrice
log_activity qui accepte une fonction func comme argument.
- À l'intérieur de
log_activity, nous définissons une fonction imbriquée wrapper. Cette fonction contiendra le nouveau comportement. Elle affiche un message de journalisation, appelle la fonction originale func, puis affiche un autre message de journalisation.
- La fonction
log_activity retourne la fonction wrapper.
- La syntaxe
@log_activity au-dessus de la fonction greet est un raccourci pour greet = log_activity(greet). Elle applique notre décorateur à la fonction greet.
Maintenant, enregistrez le fichier (vous pouvez utiliser Ctrl+S ou Cmd+S). Pour exécuter le script, ouvrez le terminal intégré en bas du WebIDE et exécutez la commande suivante :
python ~/project/decorator_basics.py
Vous verrez la sortie suivante. Notez que la date et l'heure varieront.
Calling function 'greet' at 2023-10-27 10:30:00.123456
Hello, Alice!
Function 'greet' finished.
Function name: wrapper
Function docstring: None
Remarquez deux choses dans la sortie. Premièrement, notre fonction greet est maintenant enveloppée par les messages de journalisation. Deuxièmement, le nom et la docstring de la fonction ont été remplacés par ceux de la fonction wrapper. Cela peut poser problème pour le débogage et l'introspection. Dans l'étape suivante, nous apprendrons à corriger cela.