Реализация собственного контекстного менеджера

Используйте 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 истинно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее