Décorateurs Python : fonctions d'emballage et de modification
Apprenez les décorateurs Python pour modifier le comportement des fonctions de manière dynamique. Comprendre les fonctions wrapper, la syntaxe @ et la gestion des arguments dans les décorateurs.
Aperçu
Les décorateurs sont l’un des modèles de conception les plus élégants et les plus puissants de Python. Ils permettent aux développeurs de modifier ou d'étendre le comportement d'une fonction, d'une méthode ou d'une classe sans modifier définitivement son code source. Considérez un décorateur comme enveloppant une fonction dans une autre fonction pour exécuter les étapes de pré et post-traitement. Cela rend les décorateurs parfaits pour mettre en œuvre des préoccupations transversales telles que la journalisation, la synchronisation, la validation ou le contrôle d'accès.
À la base, les décorateurs travaillent parce que les fonctions Python sont des citoyens de première classe. Cela signifie que les fonctions peuvent être transmises comme arguments à d'autres fonctions, renvoyées par des fonctions et affectées à des variables. Un décorateur est simplement une fonction qui prend une autre fonction comme argument, définit une fonction wrapper imbriquée qui exécute la fonction d'origine avec une logique supplémentaire et renvoie cette fonction wrapper pour remplacer l'originale.
Pour rendre l'application des décorateurs simple et propre, Python fournit le sucre syntaxique `@decorator_name`, placé immédiatement au-dessus de la définition de la fonction cible. Lors de l’appel de la fonction décorée, Python appelle à la place le wrapper. Si la fonction accepte des paramètres, le wrapper doit accepter des arguments arbitraires (`*args` et `**kwargs`) et les transmettre correctement. Comprendre les décorateurs vous permet d'écrire du code hautement modulaire, propre et SEC (Ne vous répétez pas).
Sortie de code et d'exécution
Un décorateur personnalisé qui suit et enregistre les détails d'exécution des fonctions.
def call_tracker(func):
"""Decorator that tracks and logs function execution details."""
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__} with args: {args}")
result = func(*args, **kwargs)
print(f"{func.__name__} returned: {result}")
return result
return wrapper
@call_tracker
def multiply(a, b):
return a * b
# Calling the decorated function
result = multiply(5, 4)Calling multiply with args: (5, 4)
multiply returned: 20Mise en œuvre étape par étape
- Journalisation des métriques d'exécution sur les moniteurs de performances
- Application des contrôles d'authentification et d'autorisation sur les itinéraires
- Mise en cache ou mémorisation de résultats de calcul coûteux
Foire aux questions
Comment les décorateurs gèrent-ils les disputes ?
En utilisant *args et **kwargs dans la fonction wrapper imbriquée, ce qui lui permet de recevoir et de transmettre tous les paramètres de position ou de mot-clé à la fonction encapsulée.
Pouvez-vous appliquer plusieurs décorateurs à une seule fonction ?
Oui, vous pouvez les empiler. Ils seront exécutés dans l’ordre de haut en bas (du plus intérieur au plus extérieur).
Sujets connexes
Maîtrisez les fonctions Python. Apprenez à écrire du code réutilisable à l'aide de def, à définir des arguments, à renvoyer des valeurs et à comprendre la portée localement et globalement.
Gestionnaires de contexte PythonApprenez à écrire des gestionnaires de contexte personnalisés en Python. Maîtrisez le décorateur contextmanager et les méthodes __enter__/__exit__ pour la sécurité des ressources.
Ressources Python recommandées
Développez vos connaissances avec des didacticiels interactifs, des aide-mémoire et des comparaisons de codes associés.
Comment trier une liste en Python
Apprenez à trier une liste en Python à l'aide de la méthode sort() et de la fonction sorted(). Découvrez des exemples de tri de clés personnalisé et d’ordre inverse.
Aide-mémoire sur les méthodes de chaîne Python
Un guide de référence complet pour la manipulation des chaînes Python. Maîtrisez le formatage, la recherche, le fractionnement, le remplacement et la vérification des propriétés des chaînes.
Python vs JavaScript : quel langage de programmation est le meilleur ?
Une comparaison complète entre Python et JavaScript. Explorez les différences de syntaxe, les performances, les cas d'utilisation (backend et frontend) et des exemples de codage.