Вопрос проверяет знание специальных магических методов, которые делают объект асинхронным контекстным менеджером.
Асинхронный контекстный менеджер использует два метода: __aenter__ и __aexit__. Они являются асинхронными и возвращают корутины. __aenter__ вызывается при входе в async with. __aexit__ вызывается при выходе из блока, даже если произошла ошибка. Эти методы позволяют управлять ресурсами безопасно.
Чтобы объект можно было использовать в async with, он должен реализовать два специальных асинхронных метода.
__aenter__
вызывается при входе в async with
должен быть объявлен как async def
может возвращать объект, который будет доступен внутри блока
__aexit__
вызывается при выходе из async with
получает информацию об исключении (если оно возникло)
отвечает за освобождение ресурсов
class AsyncResource:
async def __aenter__(self):
print("Открываем ресурс")
return self
async def __aexit__(self, exc_type, exc, tb):
print("Закрываем ресурс")
при входе выполняется await obj.__aenter__()
код внутри блока выполняется
при выходе выполняется await obj.__aexit__(...)
Даже если внутри блока возникло исключение, __aexit__ все равно будет вызван.
Методы __aenter__ и __aexit__ — это основа асинхронных контекстных менеджеров и главный механизм управления ресурсами в async with.