Я понимаю , почему contextlib.nested устарел .
Но если я напишу программу для старой версии Python без множественной формы with (то есть <2.7),У меня (почти) нет другого выбора. </p>
Во избежание сбоя следующей конструкции:
with nested(open("f1"), open("f2")) as (f1, f2):
(f1
не будет закрыто, если открытие f2
завершится неудачно,потому что менеджер контекста не введен)
Я мог бы представить себе менеджер контекста, который перемещает инициализацию в его __enter__
:
@contextmanager
def late_init(f, *a, **k):
r = f(*a, **k)
with r as c: yield c
Прав ли я, думая, что
with nested(late_init(open, "f1"), late_init(open, "f2")) as (f1, f2):
здесь будет достаточно, чтобы сделать его «чистым»?
Данный пример использования является лишь примером.Представьте, что у вас есть список файлов, длина которых неизвестна преждевременно.Тогда ни составной 2,7 with
не может быть использован, ни вложенный способ до 2,7 с несколькими отступами with
операторов.
Я, вероятно, должен быть более многословен по этому поводу.
Упомянутый способ решения проблемы на первый взгляд решает проблему: вызов функции выполняется в безопасном месте, так что сбой может быть обнаружен и соответствующим образом обработан.
Мой вопрос: устраняет ли это ошибку или я получаюдругие проблемы?