<MyRusakov.ru />

WordPress 6 с Нуля до Гуру

WordPress 6 с Нуля до Гуру

Этот курс научит Вас созданию самых разных сайтов на самой популярной в мире CMS - WordPress. Вы увидите установку и настройку локального сервера, разбор каждой настройки, каждой кнопки и каждого пункта меню в панели WordPress.

Также Вы получите и всю практику, поскольку прямо в курсе с нуля создаётся полноценный Интернет-магазин, который затем публикуется в Интернете. И всё это прямо на Ваших глазах.

Помимо уроков к курсу идут упражнения для закрепления материала.

И, наконец, к курсу идёт ценнейший Бонус по тому, как используя ChatGPT и создавая контент для сайта, можно выйти на пассивный доход. Вы наглядно увидите, как зарегистрироваться в ChatGPT (в том числе, и если Вы из России), как правильно выбрать тему для сайта, как правильно генерировать статьи для него(чтобы они индексировались поисковыми системами) и как правильно монетизировать трафик на сайте.

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Менеджеры контекста в Python: как работает with и библиотека contextlib

Менеджеры контекста в Python: как работает with и библиотека contextlib

Менеджеры контекста в Python — один из самых полезных инструментов для управления ресурсами. Если вы ищете, как работает оператор with, что такое методы __enter__ и __exit__, и зачем нужен модуль contextlib, это краткое и практичное руководство для вас.

Что такое менеджер контекста и зачем нужен

Ресурсы (файлы, сокеты, блокировки, временные директории) нужно корректно освобождать даже при ошибках. Менеджер контекста гарантирует это: входим в контекст — ресурс открывается, выходим — ресурс освобождается. Для этого в Python есть оператор with и протокол __enter__/__exit__.

Оператор with: базовый и самый полезный пример

from pathlib import Path

path = Path('data.txt')
with path.open(encoding='utf-8') as f:
    for line in f:
        print(line.strip())

Здесь файл всегда закроется автоматически — даже если внутри блока случится исключение.

Как это устроено под капотом: __enter__ и __exit__

Любой объект, у которого определены методы __enter__ и __exit__, можно использовать в with. Метод __enter__ возвращает объект для работы в блоке, а __exit__ выполняется при выходе из блока, в том числе при исключении.

import time
from typing import Optional

class Timer:
    def __init__(self, name: str = 'block'):
        self.name = name
        self.started: Optional[float] = None

    def __enter__(self):
        self.started = time.perf_counter()
        return self

    def __exit__(self, exc_type, exc, tb):
        elapsed = time.perf_counter() - (self.started or 0.0)
        print(f'[{self.name}] {elapsed:.3f}s')
        # False — не подавлять исключения, пусть пробрасываются дальше
        return False

with Timer('download'):
    time.sleep(0.2)

Если __exit__ вернёт True, исключение будет подавлено. Обычно это нежелательно (подробнее ниже).

contextlib: быстро и удобно

Встроенный модуль contextlib позволяет создавать менеджеры контекста проще и предоставляет готовые утилиты.

@contextmanager: свой менеджер за пару строк

from contextlib import contextmanager

@contextmanager
def opened_utf8(path, mode='r'):
    f = open(path, mode, encoding='utf-8')
    try:
        yield f  # отдаём ресурс наружу
    finally:
        f.close()  # гарантированно закрываем

with opened_utf8('notes.txt', 'w') as f:
    f.write('Привет!')

suppress: аккуратно подавить ожидаемую ошибку

from contextlib import suppress

user_input = 'not a number'
with suppress(ValueError):
    print(int(user_input))  # исключение ValueError будет подавлено

Используйте suppress, когда отсутствие значения, файл не найден или другая контролируемая ошибка — это нормальная ситуация логики.

redirect_stdout и redirect_stderr: перенаправление вывода

from contextlib import redirect_stdout

with open('log.txt', 'w', encoding='utf-8') as log, redirect_stdout(log):
    print('Это уйдёт в файл')
    print('И это тоже')

nullcontext: когда контекст может быть опциональным

from contextlib import nullcontext

need_log = False
cm = open('out.txt', 'w', encoding='utf-8') if need_log else nullcontext()
with cm as f:
    if need_log:
        f.write('Логируем...')
    # основной код

ExitStack: динамическое и множественное управление ресурсами

from contextlib import ExitStack

files = ['a.txt', 'b.txt', 'c.txt']
with ExitStack() as stack:
    opened = [stack.enter_context(open(p, 'w', encoding='utf-8')) for p in files]
    for i, f in enumerate(opened, 1):
        f.write(f'Файл №{i}\n')
# все файлы закрыты даже при ошибках

Бонус: временные каталоги — тоже менеджеры контекста

from tempfile import TemporaryDirectory
from pathlib import Path

with TemporaryDirectory() as tmp:
    tmp_path = Path(tmp)
    (tmp_path / 'test.txt').write_text('ok', encoding='utf-8')
    print('Временная папка:', tmp_path)
# каталог удалён автоматически

Частые ошибки и как их избежать

  • Подавление всех исключений: возврат True из __exit__ скрывает любые ошибки и усложняет отладку.
  • Выделение ресурса вне контекста: открывайте и настраивайте ресурс внутри менеджера, чтобы гарантировать освобождение.
  • Слишком общий suppress: указывайте конкретные типы исключений, иначе «съедите» важные ошибки.
  • Забыли про ExitStack: если число ресурсов заранее неизвестно, не плодите вложенные with — используйте ExitStack.
# Антипример: глотает все ошибки
class Swallow:
    def __enter__(self):
        pass
    def __exit__(self, exc_type, exc, tb):
        return True  # ПЛОХО: скрывает любые исключения

with Swallow():
    1 / 0  # Ошибка будет подавлена!

Практические рекомендации

  • Всегда используйте with для файлов, блокировок и внешних подключений.
  • Для «одноразовых» менеджеров пишите генератор с @contextmanager — это короче и нагляднее.
  • Для сложных случаев и «много ресурсов» отдайте предпочтение ExitStack.
  • Локально подавляйте ожидаемые ошибки через suppress, не злоупотребляйте им глобально.
  • Покрывайте пользовательские менеджеры тестами: важно проверить и «штатный», и «ошибочный» путь выхода.

Когда писать свой менеджер контекста

  • Нужно гарантированно освобождать ресурс (соединение, временный файл, блокировку).
  • Нужно выполнить обязательные действия «до» и «после» блока: логирование, метрики, транзакции.
  • Нужно унифицировать ошибочные сценарии (например, откат изменений).

Итог

Менеджеры контекста и оператор with — основа надёжных программ на Python. Освойте __enter__/__exit__, используйте contextlib и ExitStack — и ваши ресурсы всегда будут под контролем, а код станет короче и безопаснее.

Хотите ещё больше практики с задачами и разбором нюансов языка? Рекомендую практический курс «Python с Нуля до Гуру»: пошагово от базовых конструкций до уверенной разработки.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.