Leçon 7 / 10 — Chapitre 5: Itérateurs, générateurs et context managers
Comment fonctionne réellement with
Python Intermédiaire a montré with open(...) as fichier: sans expliquer son mécanisme interne. Un objet utilisable avec with est un context manager : il implémente deux méthodes spéciales, __enter__ et __exit__.
class Ressource:
def __enter__(self):
print("Ouverture")
return self
def __exit__(self, type_erreur, valeur_erreur, traceback):
print("Fermeture")
with Ressource() as r:
print("Utilisation")
Ce code affiche Ouverture, Utilisation, puis Fermeture — dans cet ordre précis. __enter__ s'exécute à l'entrée du bloc with, et sa valeur de retour (self, ici) est affectée à r via as r. __exit__ s'exécute automatiquement à la sortie du bloc, que ce soit normalement ou à cause d'une erreur.
C'est exactement ce mécanisme qui garantit qu'un fichier ouvert avec with open(...) (vu dans Python Intermédiaire) se referme toujours, même si une erreur survient au milieu du bloc : __exit__ s'exécute dans les deux cas.
with Ressource() as r:
print("Avant erreur")
raise ValueError("Oups")
Ce code affiche Ouverture, Avant erreur, puis Fermeture avant que l'erreur ValueError ne remonte et n'arrête le programme — __exit__ s'exécute systématiquement, même en cas d'erreur dans le bloc.
À vous de jouer : créez une classe avec __enter__ et __exit__ qui affichent chacun un message, et utilisez-la dans un bloc with.
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