contextlib.contextmanager: правильное управление ресурсами

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

contextlibcontextmanagerpython

ℹ️ В Python при работе с ресурсами, такими как файлы, соединения с базой данных или сетевые сокеты, важно правильно их закрывать после использования, чтобы избежать утечек. Вместо того чтобы вручную заботиться о закрытии этих ресурсов, можно использовать contextlib.contextmanager для создания контекстного менеджера.

🔥 Пример: управление соединением с базой данных

Предположим, что нужно работать с базой данных SQLite. Мы создаём контекстный менеджер, который откроет соединение с БД, передаст управление в блок с кодом и автоматически закроет соединение после завершения работы.

import contextlib
import sqlite3

# Контекстный менеджер для работы с БД
@contextlib.contextmanager
def get_db_connection(db_name):
    conn = sqlite3.connect(db_name)  # открываем соединение
    try:
        yield conn  # передаем управление в блок с кодом
    finally:
        conn.close()  # автоматически закрываем соединение после выполнения

# Использование
with get_db_connection('my_database.db') as conn:
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users")
    print(cursor.fetchall())

Что происходит:

  • @contextlib.contextmanager - декоратор, который позволяет создать простой контекстный менеджер без необходимости вручную реализовывать методы __enter__ и __exit__.
  • yield conn - передача управления в блок with. Когда выполнение выходит из блока, вызывается часть кода после yield — в нашем случае закрытие соединения с базой данных.
  • Автоматическое закрытие - даже если в блоке with возникнет исключение, соединение всё равно будет закрыто.

✳️ Таким образом, с помощью contextlib.contextmanager можно значительно улучшить управление ресурсами и избежать множества потенциальных проблем с утечками и забытыми закрытиями.

tags: #полезно #разработка #python

🧭 @recura_tech

Скриншот тёмной темы терминала с примером кода Python: использование contextlib.contextmanager для открытия и автоматического закрытия соединения SQLite.
Пример кода: контекстный менеджер для работы с SQLite через contextlib.contextmanager.

Читайте так же