objectif
Empiler dynamiquement plusieurs contextes et callbacks de nettoyage.
code minimal
from contextlib import ExitStack
from tempfile import TemporaryDirectory
from pathlib import Path
with TemporaryDirectory() as tmp:
root = Path(tmp)
with ExitStack() as stack:
f1 = stack.enter_context(open(root/"a.txt", "w", encoding="utf-8"))
f2 = stack.enter_context(open(root/"b.txt", "w", encoding="utf-8"))
stack.callback(lambda: (root/"done").write_text("1", encoding="utf-8"))
f1.write("A"); f2.write("B")
print((root/"done").exists()) # attendu: True
utilisation
from contextlib import ExitStack
with ExitStack() as st:
pass
print(True)
variante(s) utile(s)
from contextlib import ExitStack, suppress
with ExitStack() as st:
st.enter_context(suppress(ZeroDivisionError))
1/0
print(True)
notes
- ExitStack ferme dans l’ordre inverse d’empilement (LIFO).
- Ajoutez des callbacks arbitraires avec callback().