Fondamentaux des décorateurs Python

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Les décorateurs en Python vous permettent de modifier ou d'améliorer le comportement d'une fonction, d'une classe ou d'une méthode. Ils sont un moyen de modifier dynamiquement la fonctionnalité de votre code sans modifier le code source. Dans ce laboratoire, nous allons explorer les bases des décorateurs et apprendre à les utiliser pour ajouter des fonctionnalités à votre code.

Comprendre les décorateurs

Commenceons par un exemple simple. Ouvrez une nouvelle session d'interpréteur Python :

python3

Nous avons une fonction qui calcule le carré d'un nombre :

def square(x):
    return x**2

Maintenant, disons que nous voulons ajouter une fonctionnalité à la fonction square qui enregistre l'entrée et la sortie de la fonction chaque fois qu'elle est appelée. Nous pouvons le faire en utilisant un décorateur.

Voici le code pour le décorateur logger :

def logger(func):
    def wrapper(x):
        print("Appel de la fonction :", func.__name__)
        print("Entrée :", x)
        result = func(x)
        print("Sortie :", result)
        return result
    return wrapper

Maintenant, nous pouvons utiliser ce décorateur pour améliorer la fonction square :

@logger
def square(x):
    return x**2

Lorsque nous appelons square(5), la sortie sera :

Appel de la fonction : square
Entrée : 5
Sortie : 25

Comme vous pouvez le voir, le décorateur a ajouté la fonctionnalité souhaitée à la fonction square sans modifier son code source.

Les décorateurs avec paramètres

Les décorateurs peuvent également accepter des paramètres. Par exemple, nous pourrions modifier le décorateur logger pour accepter un message à imprimer avant les journaux d'entrée et de sortie.

def logger(message):
    def decorator(func):
        def wrapper(x):
            print(message)
            print("Appel de la fonction :", func.__name__)
            print("Entrée :", x)
            result = func(x)
            print("Sortie :", result)
            return result
        return wrapper
    return decorator

Maintenant, nous pouvons utiliser ce décorateur mis à jour pour améliorer la fonction square :

@logger("Ceci est un message personnalisé")
def square(x):
    return x**2

Lorsque nous appelons square(5), la sortie sera :

Ceci est un message personnalisé
Appel de la fonction : square
Entrée : 5
Sortie : 25

Utiliser plusieurs décorateurs

Vous pouvez également empiler plusieurs décorateurs les uns sur les autres pour ajouter plusieurs niveaux de fonctionnalité. Par exemple, créons un nouveau décorateur appelé timer qui mesure le temps qu'il prend à une fonction de s'exécuter :

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("Temps écoulé :", end_time - start_time)
        return result
    return wrapper

Maintenant, utilisons les décorateurs logger et timer sur la fonction square :

@logger("Ceci est un message personnalisé")
@timer
def square(x):
    return x**2

Lorsque nous appelons square(5), la sortie sera :

Ceci est un message personnalisé
Appel de la fonction : square
Entrée : 5
Sortie : 25
Temps écoulé : 0,000001

Comme vous pouvez le voir, le décorateur timer a ajouté l'information sur le temps écoulé à la fonction square, tandis que le décorateur logger a ajouté les journaux d'entrée et de sortie et le message personnalisé.

Récapitulatif

Dans ce laboratoire, nous avons appris les bases des décorateurs en Python. Nous avons vu comment utiliser les décorateurs pour modifier le comportement d'une fonction, d'une classe ou d'une méthode, et comment utiliser plusieurs décorateurs pour ajouter plusieurs niveaux de fonctionnalité. Nous avons également vu comment utiliser des décorateurs avec des paramètres pour ajouter une fonctionnalité personnalisée.

Avec ces compétences, vous pouvez désormais commencer à intégrer des décorateurs dans votre code pour faciliter votre vie en tant que développeur!