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).