← retour aux snippets

contextlib: ExitStack pour ressources multiples

Empiler dynamiquement plusieurs contextes et callbacks de nettoyage.

python patterns #contextlib#exitstack

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