Python Contextlib
-
Utiliser l’instruction
with
comme gestionnaire de contexte en Python -
Utiliser le décorateur de fonction
@contextmanager
en Python
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
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