Если внутри контекстного менеджера сделать return соединения, оно вернётся открытым или закрытым?

Перед фактическим возвратом из функции Python вызовет __exit__ контекстного менеджера. Если он закрывает соединение, вызывающий код получит уже закрытый объект; но не каждый менеджер соединения закрывает его.

Короткий ответ

Что ответить на собеседовании

Перед фактическим возвратом из функции Python вызовет exit контекстного менеджера. Если он закрывает соединение, вызывающий код получит уже закрытый объект; но не каждый менеджер соединения закрывает его.

Подробный разбор

Ответ с пояснениями

Перед фактическим возвратом из функции Python вызовет exit контекстного менеджера. Если он закрывает соединение, вызывающий код получит уже закрытый объект; но не каждый менеджер соединения закрывает его.

Сначала вычисляется выражение return, затем выполняется выход из with, и только после этого значение передаётся вызывающему. Некоторые библиотечные менеджеры управляют только транзакцией, другие возвращают соединение в пул. Поэтому нужно проверить контракт конкретного объекта. Безопаснее выполнять нужные операции внутри его области жизни или передавать вызывающему сам контекстный менеджер с явными правилами владения.

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

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

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

Подробнее