3 цікаві способи використання менеджерів контексту Python - KDnuggets

3 цікаві варіанти використання менеджерів контексту Python – KDnuggets

Вихідний вузол: 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 або новіша tomllib.

 

Python має вбудований tomllib модуль (введений у 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. The load() функція повертає словник Python. Ви можете переконатися в цьому, роздрукувавши вміст credentials:

print(credentials)

 

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

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

Скажімо, ви хочете підключитися до бази даних Postgres. Ви можете встановити роз'єм psycopg2 за допомогою pip:

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. The subprocess.Popen() конструктор створює новий підпроцес. Який ви можете використовувати в a 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, науку про дані та обробку природної мови. Вона любить читати, писати, кодувати та кави! Зараз вона навчається та ділиться своїми знаннями зі спільнотою розробників, створюючи навчальні посібники, інструкції, думки тощо.

Часова мітка:

Більше від KDnuggets