Les décorateurs Python sont des outils puissants qui nous permettent de modifier ou d'améliorer le comportement des fonctions ou des méthodes. Les cas d'utilisation courants incluent la journalisation, l'autorisation, etc.
Cependant, lorsqu'on leur demande de définir ce qu'est un décorateur, beaucoup pourraient répondre :
C'est un wrapper pour une fonction.
Bien que cela soit techniquement correct, il se passe bien plus de choses sous le capot.
Disséquer un simple décorateur
Explorons un exemple simple :
def my_decorator(func): def wrapper(*args, **kwargs): print("Before calling the function") result = func(*args, **kwargs) print("After calling the function") return result return wrapper @my_decorator def say_hello(name): print(f"Hello, {name}!")
Ici, my_decorator est un décorateur pour la fonction say_hello. Lorsque say_hello est défini, il est automatiquement transmis à my_decorator, transformant l'appel de fonction en :
say_hello = mon_décorateur(say_hello)
Quand cette transformation se produit-elle ?
Cette transformation se produit lors de la compilation du code, spécifiquement au moment de la définition de la fonction, et non au moment de l'exécution.
Démontage du code
Pour comprendre comment fonctionnent les décorateurs à un niveau inférieur, nous pouvons utiliser le module dis pour examiner le bytecode de la fonction décorée :
import dis @my_decorator def say_hello(name): print(f"Hello, {name}!") dis.dis(say_hello)
Répartition du bytecode
La sortie de dis.dis(say_hello) pourrait ressembler à ceci :
Explication du bytecode
Avant d'appeler la fonction
Appel de la fonction d'origine
Après l'appel de la fonction
Conclusion
Les décorateurs Python sont plus que de simples wrappers de fonctions ; ils nous permettent de modifier le comportement de la fonction au moment de la définition. En comprenant leur fonctionnement et en examinant le bytecode, nous pouvons utiliser les décorateurs plus efficacement dans nos projets.
C'est tout pour l'instant ! S'il y a autre chose que vous aimeriez que j'aborde, faites-le-moi savoir !
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3