objectif
Gérer ouverture/fermeture de ressources avec @contextmanager.
code minimal
from contextlib import contextmanager
from pathlib import Path
from tempfile import TemporaryDirectory
@contextmanager
def open_text(path, mode="r", encoding="utf-8"):
f = open(path, mode, encoding=encoding)
try:
yield f
finally:
f.close()
with TemporaryDirectory() as tmp:
p = Path(tmp) / "x.txt"
with open_text(p, "w") as fh:
fh.write("ok\n")
print(p.read_text().strip() == "ok") # attendu: True
utilisation
from contextlib import contextmanager
@contextmanager
def dummy():
yield 42
with dummy() as v:
print(v == 42)
variante(s) utile(s)
from contextlib import contextmanager
@contextmanager
def suppress_exc():
try:
yield
except ZeroDivisionError:
pass
with suppress_exc():
1/0
print(True)
notes
- Placez cleanup dans finally pour garantir la libération.
- Combinez avec ExitStack pour des contextes dynamiques.