Короткий ответ Контекстный менеджер — объект с методами __enter__ и __exit__, гарантирующий выполнение кода освобождения ресурса (например, закрытие файла) даже если внутри блока произошло исключение. Как это работает подробнее При входе в блок with Python вызывает __enter__() объекта и присваивает результат переменной после as; при выходе из блока (нормальном или через исключение) гарантированно вызывается __exit__(), которому передаются тип, значение и traceback исключения, если оно было. Пример кода Что использовать на практике Практика. open() возвращает файловый объект, который сам является контекстным менеджером — его __exit__ вызывает close(). Это избавляет от необходимости вручную писать try/finally для закрытия файла, лока или соединения. Подводные камни Риски. Открывают файл без with и забывают закрыть его явно, особенно в ветке с исключением; путают __exit__ с «выполняется только при успехе», не понимая, что он вызывается и при исключении.