contextlib : @contextmanager
Créez facilement des gestionnaires de contexte avec le décorateur de contextlib.
contextlib : @contextmanager est une leçon Python Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Python Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Python Academy comprend 4 leçons au total.
Pourquoi utiliser contextlib ?
contextlib.contextmanager vous permet d'écrire un gestionnaire de contexte sous la forme d'une fonction génératrice plutôt que d'une classe, ce qui réduit le code répétitif.
from contextlib import contextmanager
@contextmanager
def managed():
print("setup")
yield
print("teardown")
with managed():
print("inside")Renvoyer une valeur
La valeur que vous yield est associée à la variable as dans l'instruction with.
from contextlib import contextmanager
@contextmanager
def temp_list():
lst = []
yield lst
print(f"Final list: {lst}")
with temp_list() as lst:
lst.append(1)
lst.append(2)Gestion des exceptions avec @contextmanager
Placez yield dans un bloc try/finally afin de garantir le nettoyage, même si une exception se produit.
from contextlib import contextmanager
@contextmanager
def safe_open(path):
f = open(path)
try:
yield f
finally:
f.close()
with safe_open("data.txt") as f:
print(f.read())Supprimer les exceptions
Interceptez l'exception dans le générateur pour la supprimer — c'est équivalent à renvoyer True depuis __exit__.
from contextlib import contextmanager
@contextmanager
def ignore_value_errors():
try:
yield
except ValueError:
pass
with ignore_value_errors():
raise ValueError("ignored")contextlib.suppress
contextlib.suppress(*exceptions) est un gestionnaire de contexte prêt à l'emploi qui supprime les types d'exception spécifiés.
from contextlib import suppress
with suppress(FileNotFoundError):
open("missing.txt")
print("continues")contextlib.closing
closing(obj) crée un gestionnaire de contexte qui appelle obj.close() à la sortie. Il est utile pour les objets qui possèdent close(), mais pas __exit__.
from contextlib import closing
from urllib.request import urlopen
with closing(urlopen("https://example.com")) as page:
content = page.read()contextlib.nullcontext
nullcontext est un gestionnaire de contexte sans effet. Il est utile lorsqu'un gestionnaire de contexte est facultatif.
from contextlib import nullcontext
def process(data, lock=None):
cm = lock if lock is not None else nullcontext()
with cm:
return [x*2 for x in data]contextlib.ExitStack
ExitStack vous permet de gérer dynamiquement un nombre variable de gestionnaires de contexte.
from contextlib import ExitStack
files = ["a.txt", "b.txt", "c.txt"]
with ExitStack() as stack:
handles = [stack.enter_context(open(f)) for f in files]
data = [h.read() for h in handles]Réutiliser @contextmanager
Un gestionnaire de contexte fondé sur un générateur ne peut être utilisé qu'une seule fois par appel. Appelez de nouveau la fonction décorée pour le réutiliser.
from contextlib import contextmanager
@contextmanager
def counter():
count = 0
yield lambda: count.__add__ # each call is independent
print("done")
with counter():
pass
with counter():
passasynccontextmanager
Pour le code asynchrone, utilisez contextlib.asynccontextmanager afin d'écrire des gestionnaires async with sous la forme de générateurs.
from contextlib import asynccontextmanager
@asynccontextmanager
async def async_session():
session = await create_session()
try:
yield session
finally:
await session.close()contextlib.redirect_stdout
Redirigez temporairement la sortie standard vers n'importe quel objet similaire à un fichier.
import io
from contextlib import redirect_stdout
buf = io.StringIO()
with redirect_stdout(buf):
print("captured")
print(buf.getvalue()) # capturedVérification rapide
Dans un générateur @contextmanager, où faut-il placer le code de nettoyage pour garantir son exécution, même en cas d'exception ?
Récapitulatif
@contextmanager transforme un générateur en gestionnaire de contexte. Utilisez try/finally autour de yield pour effectuer un nettoyage fiable. Le module contextlib fournit également suppress, nullcontext, ExitStack, et bien d'autres outils.
Questions Fréquemment Posées
La leçon « contextlib : @contextmanager » est-elle gratuite ?
Oui — le texte complet de « contextlib : @contextmanager » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Python Academy, passe à CoddyKit PRO. Le cours Python Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « contextlib : @contextmanager » ?
Créez facilement des gestionnaires de contexte avec le décorateur de contextlib. Tu pratiques Python Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Python Academy ?
Aucune expérience préalable n'est requise. Python Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « contextlib : @contextmanager » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Python Academy ?
Oui. Chaque leçon Python Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- L’instruction with en profondeur
- Protocole __enter__ et __exit__
- contextlib : @contextmanager
- Schémas pratiques de gestionnaires de contexte