Leçon 9 / 10 — Chapitre 5: Itérateurs, générateurs et context managers
Créer un context manager avec @contextmanager
Écrire une classe complète avec __enter__/__exit__ est verbeux pour un cas simple. contextlib.contextmanager transforme une fonction génératrice (vue dans ce chapitre) en context manager, avec un seul yield qui marque la frontière entre entrée et sortie.
from contextlib import contextmanager
import time
@contextmanager
def chronometre():
debut = time.time()
yield
duree = time.time() - debut
print(f"Duree : {duree:.4f} secondes")
with chronometre():
total = 0
for i in range(1000000):
total = total + i
Ce code affiche le même résultat que la classe Chronometre de la leçon précédente, avec bien moins de code. Tout ce qui précède yield s'exécute comme __enter__ (à l'entrée du bloc with) ; tout ce qui suit yield s'exécute comme __exit__ (à la sortie du bloc) — le yield lui-même marque le moment où le code du bloc with s'exécute.
Si yield doit fournir une valeur récupérable avec as, on écrit yield valeur :
@contextmanager
def ressource_nommee(nom):
print(f"Ouverture de {nom}")
yield nom
print(f"Fermeture de {nom}")
with ressource_nommee("fichier.txt") as nom:
print("Utilisation de", nom)
À vous de jouer : écrivez un context manager avec @contextmanager, dont le code avant yield affiche un message d'ouverture et celui après yield un message de fermeture.
Continuez ce module
Débloquez les leçons restantes ainsi que la certification finale.
2 500 XOF / 3,81 € / 4,15 $
Débloquez les 87 leçons restantes de ce module
Votre paiement est vérifié avant l'activation de l'accès