Используйте contextlib.contextmanager: код до yield выполняет вход, finally — обязательное завершение. Повторный импорт того же модуля обычно не исполняет его заново.
Реализация собственного контекстного менеджера
Используйте contextlib.contextmanager: код до yield выполняет вход, finally — обязательное завершение. Повторный импорт того же модуля обычно не исполняет его заново.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Требуется написать свой контекстный менеджер, которым можно пользоваться в конструкции with. Ниже приведён пример того, как может выглядеть модуль и основной файл, где будет применяться ваш менеджер.
### module.py
print("Module executed")
### main.py
import module
import module as a
import contextlib
def mymanager()
with mymanager():
pass
В этом примере демонстрируется импорт модуля двумя способами и использование вашего контекстного менеджера внутри блока with. Реализуйте необходимый функционал, чтобы код корректно работал.
Ответ
Используйте contextlib.contextmanager: код до yield выполняет вход, finally — обязательное завершение. Повторный импорт того же модуля обычно не исполняет его заново.
from contextlib import contextmanager
@contextmanager
def mymanager():
print('Вход')
try:
yield
finally:
print('Выход')
with mymanager():
print('Работа')
Будут напечатаны Вход, Работа, Выход. При исключении внутри with блок finally также выполнится, а исключение продолжит распространяться: здесь оно не подавляется.
В исходном примере нужно исправить двоеточие после объявления функции и отступы. import module и import module as a используют один объект из кеша модулей, поэтому Module executed обычно выводится один раз, а module is a истинно.