Python Academy · Урок

Оператор with подробно

Разберитесь, как работает with и почему он предотвращает утечки ресурсов.

Урок 1 из 414 шагов

«Оператор with подробно» — бесплатный урок Python Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

Введение

Инструкция with гарантирует выполнение кода настройки и освобождения ресурсов, даже если возникают исключения.

Базовое использование with

with expr as var: — expr должен возвращать менеджер контекста. Переменной var присваивается всё, что возвращает __enter__.
with open('/tmp/cm_test.txt','w') as f:
    f.write('hello')
print('file closed:', f.closed)

Зачем нужна with

Такие ресурсы, как файлы, блокировки и подключения к базам данных, необходимо освобождать. with гарантирует очистку, даже если исключение прерывает выполнение тела блока.
# Without with:
# f = open('f.txt')
# try: ...
# finally: f.close()
# With with:
# with open('f.txt') as f: ...
print('with is cleaner')

Несколько менеджеров контекста

with open(a) as f, open(b) as g: открывает два ресурса в одной инструкции. Оба ресурса закрываются при выходе.
import tempfile, os
a = tempfile.mktemp(); b = tempfile.mktemp()
with open(a,'w') as fa, open(b,'w') as fb:
    fa.write('A'); fb.write('B')
os.unlink(a); os.unlink(b)
print('both closed')

with не подавляет исключения

По умолчанию исключения в теле with передаются дальше. __exit__ может подавить их, вернув True.
try:
    with open('/nonexistent.txt') as f:
        pass
except FileNotFoundError as e:
    print('caught:', e)

Lock как менеджер контекста

threading.Lock() работает как менеджер контекста: with lock: гарантирует, что блокировка всегда будет освобождена.
import threading
lock = threading.Lock()
with lock:
    print('locked section')
print('lock released')

Шаблон подключения к базе данных

Подключение к базе данных в роли менеджера контекста фиксирует изменения при успехе и выполняет откат при исключении — это важный шаблон.
# Typical DB pattern:
# with db.transaction() as conn:
#     conn.execute(sql)
# commits on success, rolls back on exception
print('db pattern demo')

Вложенные инструкции with

Вложенные инструкции with допустимы. Внутренний менеджер контекста завершается первым, затем завершается внешний.
import tempfile
tmp = tempfile.mktemp()
with open(tmp,'w') as outer:
    with open(tmp,'r+') as inner:
        outer.write('x')
import os; os.unlink(tmp)
print('nested exit order')

contextlib.suppress

contextlib.suppress(ExcType) молча подавляет исключение указанного типа внутри блока with.
from contextlib import suppress
with suppress(FileNotFoundError):
    open('/does/not/exist.txt')
print('no error raised')

contextlib.redirect_stdout

contextlib.redirect_stdout(f) временно перенаправляет вывод print() в f.
from contextlib import redirect_stdout
import io
buf = io.StringIO()
with redirect_stdout(buf):
    print('captured')
print('got:', buf.getvalue())

ExitStack

contextlib.ExitStack управляет динамическим количеством менеджеров контекста — это удобно, когда заранее неизвестно, сколько файлов нужно открыть.
from contextlib import ExitStack
import tempfile, os
with ExitStack() as stack:
    files = [stack.enter_context(open(tempfile.mktemp(),'w')) for _ in range(3)]
    for f in files: f.write('x')
print('all closed')

Быстрая проверка

Что делает contextlib.suppress(FileNotFoundError)?

Итоги

with гарантирует очистку ресурсов. Несколько целей можно указать в одной инструкции with. contextlib.suppress подавляет определённые ошибки. ExitStack управляет динамическим количеством менеджеров контекста.

Продолжайте

Отличная работа! Следующий урок уже ждёт Вас.
Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
76
Уроки
320

Часто задаваемые вопросы

Урок «Оператор with подробно» бесплатный?

Да — полный текст урока «Оператор with подробно» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «Оператор with подробно»?

Разберитесь, как работает with и почему он предотвращает утечки ресурсов. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Оператор with подробно»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Оператор with подробно
  2. Протокол __enter__ и __exit__
  3. contextlib: @contextmanager
  4. Практические шаблоны менеджеров контекста
← Назад к Python Academy