"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comprendre les décorateurs Python : une analyse approfondie

Comprendre les décorateurs Python : une analyse approfondie

Publié le 2024-11-08
Parcourir:952

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 :

Understanding Python Decorators: A Deep Dive
Explication du bytecode

  1. Avant d'appeler la fonction

    • LOAD_GLOBAL : charge la fonction d'impression.
    • LOAD_CONST : Charge le message 'Avant d'appeler la fonction'.
    • CALL_FUNCTION : impression des appels.
    • POP_TOP : rejette la valeur de retour.
  2. Appel de la fonction d'origine

    • LOAD_DEREF : charge la fonction d'origine (func) capturée par la fermeture.
    • LOAD_FAST : charge les arguments de position et de mot-clé.
    • BUILD_MAP : crée un nouveau dictionnaire pour les arguments de mots clés.
    • CALL_FUNCTION_EX : appelle la fonction d'origine avec les arguments.
    • STORE_FAST : stocke le résultat dans une variable locale.
  3. Après l'appel de la fonction

    • Semblable à la première partie, il appelle print pour afficher "Après avoir appelé la fonction".
    • Renvoyer le résultat
    • Charge la variable de résultat et la renvoie.

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 !

Déclaration de sortie Cet article est reproduit sur : https://dev.to/aman-giri/understanding-python-decorators-a-deep-dive-pp0?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

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