ℹ️ В 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



