Вопрос проверяет понимание работы с несколькими контекстными менеджерами в Python и их одновременное использование.
В Python контекстные менеджеры используются для управления ресурсами, такими как файлы, соединения с базой данных или блокировки. Когда требуется работать с несколькими ресурсами одновременно, их можно объединить в одном операторе with, перечислив через запятую. Это упрощает код и делает его более читаемым.
Начиная с Python 2.7 и 3.1, можно использовать несколько контекстных менеджеров в одном with:
with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile:
data = infile.read()
outfile.write(data.upper())Этот код открывает два файла: один для чтения, другой для записи. После выполнения блока оба файла автоматически закрываются, даже если возникнет исключение.
Такой синтаксис эквивалентен вложенным with блокам:
with open('input.txt', 'r') as infile:
with open('output.txt', 'w') as outfile:
data = infile.read()
outfile.write(data.upper())Однако первый вариант более компактен и предпочтителен, когда менеджеры независимы.
Этот подход часто используется при работе с файлами, сетевыми соединениями или базами данных. Например, при копировании данных из одного файла в другой или при одновременном чтении из нескольких источников.
Использование нескольких контекстных менеджеров в одном with делает код чище и безопаснее, гарантируя корректное освобождение ресурсов. Это особенно полезно в сценариях, где требуется работа с несколькими ресурсами одновременно, например, при обработке файлов или транзакциях баз данных.