← retour aux snippets

contextlib.ExitStack: gérer plusieurs contextes dynamiques

Empiler des context managers conditionnels proprement.

objectif

Empiler des context managers conditionnels proprement.

code minimal

from contextlib import ExitStack
from tempfile import TemporaryDirectory, NamedTemporaryFile
from pathlib import Path

with ExitStack() as stack:
    tmpdir = stack.enter_context(TemporaryDirectory())
    tmpf = stack.enter_context(NamedTemporaryFile(delete=False))
    p = Path(tmpdir) / "x.txt"
    p.write_text("ok", encoding="utf-8")
    print(p.exists() and Path(tmpf.name).exists())  # attendu: True

utilisation

from contextlib import ExitStack
def maybe_open(path, enable: bool, stack: ExitStack):
    if enable:
        return stack.enter_context(open(path, "w", encoding="utf-8"))
    return None
with ExitStack() as st:
    f = maybe_open("out.txt", False, st)
    print(f is None)

variante(s) utile(s)

from contextlib import ExitStack
with ExitStack() as st:
    callbacks = []
    st.callback(lambda: callbacks.append("done"))
print(callbacks == ["done"])

notes

  • exitstack permet d’enregistrer contextes et callbacks dynamiquement.
  • Idéal pour ressources optionnelles (fichiers, verrous, connexions).