3 интересных варианта использования менеджеров контекста Python

3 интересных варианта использования менеджеров контекста Python

Исходный узел: 3084989

3 интересных варианта использования менеджеров контекста Python
Изображение от johnstocker на Freepik
 

Некоторое время назад я написал учебник по написание эффективного кода Python. В нем я говорил об использовании контекстных менеджеров и оператора with для эффективного управления ресурсами.

Я использовал простой пример обработки файлов, чтобы показать, как файлы автоматически закрываются при выходе из блока with, даже если есть исключение.

Хотя обработка файлов — хороший первый пример, она может быстро надоесть. Вот почему в этом уроке я хотел бы рассмотреть другие интересные варианты использования контекстных менеджеров, помимо обработки файлов. Мы сосредоточимся на обработке подключений к базе данных, управлении подпроцессами и высокоточной арифметике с плавающей запятой.

Контекстные менеджеры в Python позволяют писать более чистый код при работе с ресурсами. Они предоставляют краткий синтаксис для настройки и отключения ресурсов посредством:

  • An вводить логика, которая вызывается, когда выполнение входит в контекст и
  • An выход логика вызывается, когда выполнение выходит из контекста 

Самый простой пример — обработка файлов. Здесь мы используем open() функции в with оператор для получения обработчика файла:

with open('filename.txt', 'w') as file:
    file.write('Something random')

 

При этом получается ресурс — файловый объект, который используется (мы записываем в файл) внутри блока кода. Файл закрывается, как только выполнение выходит из контекста; поэтому утечек ресурсов нет.

Вы можете написать общую версию этого так:

with some_context() as ctx:
    # do something useful on the resource!

# resource cleanup is automatic

 

Теперь перейдем к конкретным примерам.

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

  • Установите соединитель базы данных для работы с базой данных (например, psycopg2 для Postgres и mysql-connector-python для баз данных MySQL).
  • Проанализируйте файл конфигурации, чтобы получить параметры подключения. 
  • Использовать connect() функция установления соединения с базой данных.

 

3 интересных варианта использования менеджеров контекста Python
Подключение к БД | Изображение автора
 

После подключения к базе данных вы можете создать базу данных для запроса базы данных. Запускайте запросы и получайте результаты запроса, используя методы курсора run и fetch.

 

3 интересных варианта использования менеджеров контекста Python
Запрос к базе данных | Изображение автора
 

При этом вы создаете следующие ресурсы: соединение с базой данных и курсор базы данных. Теперь давайте напишем простой общий пример, чтобы увидеть, как мы можем использовать соединение и объекты курсора в качестве менеджеров контекста.

Анализ файлов TOML в Python

Рассмотрим пример файла TOML, скажем, db_config.toml, содержащего необходимую информацию для подключения к базе данных:

# db_config.toml

[database]
host = "localhost"
port = 5432
database_name = "your_database_name"
user = "your_username"
password = "your_password"

 

Внимание: для использования вам потребуется Python 3.11 или более поздняя версия. томлиб.

 

Python имеет встроенный томлиб модуль (представленный в Python 3.11), который позволяет анализировать файлы TOML. Итак, вы можете открыть файл db_config.toml и проанализировать его содержимое следующим образом:

import tomllib

with open('db_config.toml','rb') as file:
	credentials = tomllib.load(file)['database']

 

Обратите внимание, что мы заходим в раздел «база данных» файла db_config.toml. load() функция возвращает словарь Python. Вы можете убедиться в этом, распечатав содержимое credentials:

print(credentials)

 

Output >>>
{'host': 'localhost', 'port': 5432, 'database_name': 'your_database_name', 'user': 'your_username', 'password': 'your_password'}

Подключение к базе данных

Допустим, вы хотите подключиться к базе данных Postgres. Вы можете установить разъем psycopg2 используя пип:

pip install psycopg2

 

Вы можете использовать как соединение, так и объекты курсора с операторами, как показано:

import psycopg2

# Connect to the database
with psycopg2.connect(**credentials) as conn:
	# Inside this context, the connection is open and managed

	with conn.cursor() as cur:
    	# Inside this context, the cursor is open and managed

    	cur.execute('SELECT * FROM my_table')
    	result = cur.fetchall()
            print(result)

 

В этом коде:

  • Мы используем with оператор для создания контекста для управления подключением к базе данных. 
  • Внутри этого контекста мы создаем еще один контекст для управления курсором базы данных. Курсор автоматически закрывается при выходе из этого внутреннего контекста.
  • Поскольку соединение также закрывается при выходе из внешнего контекста, эта конструкция гарантирует правильное управление соединением и курсором, что снижает вероятность утечки ресурсов.

Вы также можете использовать аналогичную конструкцию при работе с базами данных SQLite и MySQL.

Модуль подпроцесса Python предоставляет функциональные возможности для запуска внешних команд внутри сценария Python. subprocess.Popen() конструктор создает новый подпроцесс. Который вы можете использовать в with заявление вроде так:

import subprocess

# Run an external command and capture its output
with subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, text=True) as process:
	output, _ = process.communicate()
	print(output)

 

Здесь мы запускаем команду Bash ls -l команда для длинного списка файлов в текущем каталоге:

Output >>>

total 4
-rw-rw-r-- 1 balapriya balapriya   0 Jan  5 18:31 db_info.toml
-rw-rw-r-- 1 balapriya balapriya 267 Jan  5 18:32 main.py

 

Ресурсы, связанные с подпроцессом, освобождаются, как только выполнение выходит из контекста подпроцесса. with заявление. 

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

Ассоциация localcontext() функция возвращает диспетчер контекста. Таким образом, вы можете использовать localcontext() функции в with и установите точность для текущего контекста, как показано:

from decimal import Decimal, localcontext

with localcontext() as cur_context:
    cur_context.prec = 40
    a = Decimal(2)
    b = Decimal(3)
    print(a/b)

 

Вот вывод:

Output >>>
0.6666666666666666666666666666666666666667

 

Здесь точность установлена ​​на уровне 40 десятичных знаков, но только в пределах этого значения. with блокировать. Когда выполнение выходит из текущего контекста, точность восстанавливается до точности по умолчанию (28 десятичных знаков).

В этом уроке мы узнали, как можно использовать менеджеры контекста для обработки подключений к базе данных, управления подпроцессами и контекстами с помощью высокоточной арифметики с плавающей запятой.

В следующем уроке мы увидим, как создавать собственные менеджеры контекста в Python. А пока удачного кодирования!
 
 

Бала Прия С — разработчик и технический писатель из Индии. Ей нравится работать на стыке математики, программирования, науки о данных и создания контента. Сферы ее интересов и опыта включают DevOps, науку о данных и обработку естественного языка. Она любит читать, писать, программировать и пить кофе! В настоящее время она учится и делится своими знаниями с сообществом разработчиков, создавая учебные пособия, практические руководства, авторские статьи и многое другое.

Отметка времени:

Больше от КДнаггетс