---
title: Контекстные менеджеры
questionDates:
  q-transfer-0160: '2026-10-01'
seo:
  description: >-
    Тема «Контекстные менеджеры» для собеседования Python Developer. Что такое
    менеджеры контекста, для чего используются? Что такое методы enter, exit?
  title: Контекстные менеджеры — Python Developer
---

[Все темы Python Developer](/prep/python-developer)

## <strong>Что такое менеджеры контекста, для чего используются?</strong> [#q-14bee738d69b81348de4fc73a1031f5a]

Менеджеры контекста в Python - это объекты, которые обеспечивают управление контекстом выполнения вокруг блока кода с использованием
ключевого слова <code>with</code>. Они используются для выполнения действий до и после выполнения блока кода, например, для открытия и
закрытия файлов, управления ресурсами или установки и удаления блокировок. Менеджеры контекста позволяют гарантировать правильное
завершение действий, даже в случае возникновения исключения.

:::note[Ссылки для изучения]

1. [Контекстные менеджеры в Python](https://habr.com/ru/articles/739326/)
2. [Контекстные менеджеры. Python Russian, с 0:06](https://www.youtube.com/watch?v=IG6oIbuSwCc&t=6s)

:::

---

## <strong>Что такое методы enter, exit?</strong> [#q-14bee738d69b81f684c4c0d34cdaa57a]

Методы <code>\_\_enter\_\_&#40;&#41;</code> и <code>\_\_exit\_\_&#40;&#41;</code> являются частью протокола менеджера контекста в Python.

#### <strong>Метод</strong> <code>\_\_enter\_\_&#40;&#41;</code>&#58;

- Этот метод вызывается при входе в блок кода, определенный с использованием ключевого слова <code>with</code>.

- Он обычно используется для инициализации ресурсов или выполнения каких-либо предварительных действий перед входом в контекст.

#### <strong>Метод</strong> <code>\_\_exit\_\_&#40;&#41;</code>&#58;

- Этот метод вызывается при выходе из блока кода, определенного с использованием ключевого слова <code>with</code>.

- Он используется для завершения работы с ресурсами или выполнения каких-либо завершающих действий после выхода из контекста.

- Метод <code>\_\_exit\_\_&#40;&#41;</code> также обрабатывает исключения, возникающие в блоке кода, и позволяет корректно управлять ресурсами даже при возникновении ошибок.

:::note[Ссылки для изучения]

1. [Контекстные менеджеры в Python](https://habr.com/ru/articles/739326/)
2. [Методы **enter** и **exit**. Python Russian, с 18:45](https://www.youtube.com/watch?v=IG6oIbuSwCc&t=1125s)

:::

---

## Как создать контекстный менеджер через contextlib.contextmanager? [#q-transfer-0160]

Функцию-генератор с одним `yield` декорируют `contextlib.contextmanager`. Код до `yield` получает ресурс, значение `yield` попадает в `as`, а код после него освобождает ресурс. Очистку помещают в `finally`, потому что исключение из тела `with` вбрасывается в генератор на месте `yield`. Если менеджер не должен подавлять ошибку, ее не поглощают либо поднимают снова. Корректность особенно проверяют на исключении внутри блока, потому что успешный путь не показывает ошибки очистки.

:::note[Ссылки для изучения]

1. [contextlib.contextmanager: один yield, очистка в finally и исключение из with](https://asyncio.ru/3.15/library/contextlib.html#contextlib.contextmanager)
2. [Контекстный менеджер через contextmanager. Python Russian, с 11:05](https://www.youtube.com/watch?v=IG6oIbuSwCc&t=665s)

:::
