Перед фактическим возвратом из функции Python вызовет exit контекстного менеджера. Если он закрывает соединение, вызывающий код получит уже закрытый объект; но не каждый менеджер соединения закрывает его.
Если внутри контекстного менеджера сделать return соединения, оно вернётся открытым или закрытым?
Перед фактическим возвратом из функции Python вызовет __exit__ контекстного менеджера. Если он закрывает соединение, вызывающий код получит уже закрытый объект; но не каждый менеджер соединения закрывает его.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Перед фактическим возвратом из функции Python вызовет exit контекстного менеджера. Если он закрывает соединение, вызывающий код получит уже закрытый объект; но не каждый менеджер соединения закрывает его.
Сначала вычисляется выражение return, затем выполняется выход из with, и только после этого значение передаётся вызывающему. Некоторые библиотечные менеджеры управляют только транзакцией, другие возвращают соединение в пул. Поэтому нужно проверить контракт конкретного объекта. Безопаснее выполнять нужные операции внутри его области жизни или передавать вызывающему сам контекстный менеджер с явными правилами владения.