Python contextlib.ExitStack: открыть переменное число файлов

Категория: Python · Язык: Python · Обновлено:

ExitStack управляет несколькими контекстными ресурсами, когда их количество известно только во время выполнения. Все открытые файлы закроются автоматически при выходе из with, даже если обработка завершится исключением.

Рабочий пример

Python
from contextlib import ExitStack
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as root140:
    paths140 = [Path(root140) / name for name in ("a.txt", "b.txt")]
    for item140 in paths140:
        item140.write_text(item140.stem, encoding="utf-8")
    with ExitStack() as stack140:
        files140 = [stack140.enter_context(p.open(encoding="utf-8")) for p in paths140]
        print([f.read() for f in files140])  # ['a', 'b']

enter_context регистрирует метод exit ресурса в стеке. ExitStack полезен для пакетных загрузчиков, где число файлов зависит от конфигурации или найденного набора.

Частый вопрос

Можно ли регистрировать собственную очистку?

Да, добавьте stack.callback(cleanup, аргументы) или stack.push для объекта с exit. Функции очистки вызовутся в обратном порядке регистрации.