← retour aux snippets

contextlib: créer un context manager

Gérer ouverture/fermeture de ressources avec @contextmanager.

python patterns #contextlib#contextmanager

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.