Да, класс может реализовать оба протокола. with вызывает enter/exit, а async with — aenter/aexit; Python выбирает их по синтаксису использования.
Можно ли в один класс добавить и синхронные (__enter__, __exit__) и асинхронные (__aenter__, __aexit__) методы контекстного менеджера?
Да, класс может реализовать оба протокола. with вызывает __enter__/__exit__, а async with — __aenter__/__aexit__; Python выбирает их по синтаксису использования.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Да, класс может реализовать оба протокола. with вызывает enter/exit, а async with — aenter/aexit; Python выбирает их по синтаксису использования.
Асинхронные методы должны возвращать awaitable, обычно они объявлены через async def. Синхронный вход не становится асинхронным автоматически и не должен блокировать работающий event loop длительным I/O. Оба режима могут разделять общую логику, но правила владения ресурсом и повторного входа нужно определить явно. Это удобно для библиотеки с синхронным и асинхронным клиентами при наличии соответствующих реализаций.