Python Contextlib

Fariba Laiq 8 octobre 2023
  1. Utiliser l’instruction with comme gestionnaire de contexte en Python
  2. Utiliser le décorateur de fonction @contextmanager en Python
Python Contextlib

Parfois, nous utilisons certaines ressources telles qu’un fichier. Nous l’ouvrons et oublions de le fermer lorsque nous avons fini de travailler avec.

C’est une mauvaise pratique de codage et crée des problèmes lorsque trop de fichiers sont ouverts. Même si nous n’avons plus besoin de ces ressources, le programme peut les acquérir indéfiniment.

Cette situation provoque des fuites de mémoire. Pour gérer ces choses automatiquement, Python a des gestionnaires de contexte.

Ils s’occupent de la gestion des ressources. La contextlib est une bibliothèque Python qui fournit des utilitaires pour la gestion des ressources en utilisant le mot-clé with.

Utiliser l’instruction with comme gestionnaire de contexte en Python

En Python, l’instruction with gère les ressources et gère les exceptions. Il fonctionne donc comme un gestionnaire de contexte.

Lorsque le code atteint une instruction with, il alloue temporairement des ressources. Les ressources précédemment acquises sont libérées lorsque le bloc d’instruction with termine son exécution.

Dans le code suivant, nous avons créé et ouvert un fichier. Les ressources acquises dans le bloc with seront libérées lorsque le contrôle est hors du bloc with.

Exemple de code :

with open("file.txt", "w+") as f:
    print("File Opened")

Production:

File Opened

Nous pouvons également inclure des fonctionnalités de gestionnaire de contexte dans nos programmes. Pour cela, notre classe doit avoir les méthodes __enter__() et __exit__().

Pour comprendre le flux du gestionnaire de contexte, nous avons exécuté le code suivant avec l’instruction print qui s’exécute lorsque le contrôle est transféré au bloc respectif.

Exemple de code :

class MyContextManager:
    def __init__(self):
        print("In init method")

    def __enter__(self):
        print("In enter method")

    def __exit__(self, exc_type, exc_value, exc_traceback):
        print("In exit method")


with MyContextManager() as m:
    print("With block")

Production:

In init method
In enter method
With block
In exit method

Utiliser le décorateur de fonction @contextmanager en Python

Une autre méthode pour faire d’une fonction un gestionnaire de contexte est d’utiliser le décorateur de fonction @contextmanager. Un décorateur est une fonction qui prend une autre fonction en entrée, étend ses fonctionnalités/modifie son comportement et renvoie une autre fonction en sortie.

Nous n’avons pas besoin d’écrire la classe séparée ou les fonctions __enter__() et __exit__() lors de l’utilisation de ce décorateur. Il faut importer le gestionnaire de contexte depuis le module contextlib.

Nous utiliserons le @contextmanager au-dessus de notre fonction. Le mot-clé rendement est similaire à l’instruction return utilisée pour renvoyer des valeurs/un contrôle.

Tout ce qui se trouve avant le mot clé yield sera considéré comme la section __enter__, et tout ce qui se trouve après le yield sera considéré comme la section __exit__.

Exemple de code :

from contextlib import contextmanager


@contextmanager
def MyContextManager():
    print("In enter method")
    yield
    print("In exit method")


with MyContextManager() as m:
    print("With block")

Production:

In enter method
With block
In exit method
Auteur: Fariba Laiq
Fariba Laiq avatar Fariba Laiq avatar

I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.

LinkedIn