Контекстные менеджеры - это инструмент Python, который позволяет управлять контекстом выполнения определенного кода. Они используются для выполнения некоторых действий до и после выполнения блока кода или для обеспечения безопасного использования ресурсов.
Базовый синтаксис контекстных менеджеров
with <context_manager_expression> as <variable>:
<body>
<context_manager_expression>
: Это выражение, которое создает и возвращает объект контекстного менеджера. Этот объект управляет процессом, выполняемым внутри блока "with".<variable>
: Это переменная, в которую помещается объект контекстного менеджера, возвращенный <context_manager_expression>. Эта переменная может быть использована внутри блока "with" для взаимодействия с контекстным менеджером.<body>
: Это блок кода, который будет выполнен в контексте, управляемом объектом контекстного менеджера. - В этом блоке кода можно использовать переменную <variable> для взаимодействия с контекстным менеджером.Пример использования контекстного менеджера для работы с файлами
# Открытие файла в контекстном менеджере
with open("example.txt", "r") as file:
data = file.read()
print(data)
# Файл автоматически закрывается после завершения блока with
Создание собственного контекстного менеджера:
class MyContextManager:
def __enter__(self):
print("Вход в контекст")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Выход из контекста")
# Использование собственного контекстного менеджера
with MyContextManager() as context:
print("Внутри контекста")
Использование контекстного менеджера для обеспечения безопасности
import os
class ChangeDirectory:
def __init__(self, new_dir):
self.new_dir = new_dir
self.old_dir = os.getcwd()
def __enter__(self):
os.chdir(self.new_dir)
return self
def __exit__(self, exc_type, exc_value, traceback):
os.chdir(self.old_dir)
# Использование контекстного менеджера для изменения текущей директории
with ChangeDirectory("new_directory"):
# Внутри этого блока текущая директория изменится на "new_directory"
print("Текущая директория:", os.getcwd())
# После завершения блока with текущая директория вернется к предыдущей
print("Текущая директория:", os.getcwd())
Использование контекстного менеджера для управления соединением с базой данных
import sqlite3
class DatabaseConnection:
def __init__(self, db_name):
self.db_name = db_name
def __enter__(self):
self.conn = sqlite3.connect(self.db_name)
return self.conn
def __exit__(self, exc_type, exc_value, traceback):
self.conn.close()
# Использование контекстного менеджера для работы с базой данных
with DatabaseConnection("example.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
print(row)