3 ciekawe zastosowania menedżerów kontekstu Pythona - KDnuggets

3 ciekawe zastosowania menedżerów kontekstu Pythona – KDnuggets

Węzeł źródłowy: 3084989

3 ciekawe zastosowania menedżerów kontekstu Pythona
Zdjęcie: Johnstocker on Freepik
 

Jakiś czas temu napisałem tutorial nt pisanie wydajnego kodu w Pythonie. Mówiłem w nim o używaniu menedżerów kontekstu i instrukcji with do efektywnego zarządzania zasobami.

Użyłem prostego przykładu obsługi plików, aby pokazać, jak pliki są automatycznie zamykane, gdy wykonanie kończy się z blokiem with — nawet jeśli wystąpił wyjątek.

Choć obsługa plików jest dobrym pierwszym przykładem, szybko może się znudzić. Dlatego w tym samouczku chciałbym omówić inne interesujące zastosowania menedżerów kontekstu – wykraczające poza obsługę plików. Skoncentrujemy się na obsłudze połączeń z bazami danych, zarządzaniu podprocesami i precyzyjnej arytmetyce zmiennoprzecinkowej.

Menedżerowie kontekstu w Pythonie umożliwiają pisanie czystszego kodu podczas pracy z zasobami. Zapewniają zwięzłą składnię do konfigurowania i niszczenia zasobów poprzez:

  • An wchodzić logika, która jest wywoływana, gdy wykonanie wchodzi w kontekst i
  • An wyjście logika jest wywoływana, gdy wykonanie opuszcza kontekst 

Najprostszym przykładem jest obsługa plików. Tutaj używamy open() funkcja w with instrukcja, aby uzyskać procedurę obsługi plików:

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

 

To nabywa zasób — obiekt pliku — który jest używany (zapisujemy do pliku) w bloku kodu. Plik zostaje zamknięty po wyjściu z kontekstu; więc nie ma wycieków zasobów.

Możesz napisać ogólną wersję tego w następujący sposób:

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

# resource cleanup is automatic

 

Przejdźmy teraz do konkretnych przykładów.

Kiedy tworzysz aplikacje w języku Python, dość powszechne jest łączenie się z bazami danych i wysyłanie zapytań do zawartych w nich tabel. Procedura wykonania tej operacji będzie wyglądać następująco:

  • Zainstaluj łącznik bazy danych do pracy z bazą danych (taki jak psycopg2 dla Postgres i mysql-connector-python dla baz danych MySQL).
  • Przeanalizuj plik konfiguracyjny, aby pobrać parametry połączenia. 
  • Użyj connect() funkcja umożliwiająca nawiązanie połączenia z bazą danych.

 

3 ciekawe zastosowania menedżerów kontekstu Pythona
Łączenie z bazą danych | Zdjęcie autorstwa autora
 

Po połączeniu się z bazą danych możesz utworzyć bazę danych, aby wysyłać do niej zapytania. Uruchamiaj zapytania i pobieraj wyniki zapytań za pomocą metod kursora run i fetch.

 

3 ciekawe zastosowania menedżerów kontekstu Pythona
Zapytanie o bazę danych | Zdjęcie autorstwa autora
 

W ten sposób tworzysz następujące zasoby: połączenie z bazą danych i kursor bazy danych. Zakodujmy teraz prosty, ogólny przykład, aby zobaczyć, jak możemy wykorzystać połączenie i obiekty kursora jako menedżerów kontekstu.

Parsowanie plików TOML w Pythonie

Rozważmy przykładowy plik TOML, powiedzmy db_config.toml, zawierający informacje wymagane do połączenia z bazą danych:

# db_config.toml

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

 

Note: Do użycia potrzebny jest Python 3.11 lub nowsza wersja tomllib.

 

Python ma wbudowaną funkcję tomllib moduł (wprowadzony w Pythonie 3.11), który pozwala analizować pliki TOML. Możesz więc otworzyć plik db_config.toml i przeanalizować jego zawartość w następujący sposób:

import tomllib

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

 

Zauważ, że korzystamy z sekcji „baza danych” pliku db_config.toml. The load() funkcja zwraca słownik Pythona. Możesz to sprawdzić, drukując zawartość credentials:

print(credentials)

 

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

Łączenie się z bazą danych

Załóżmy, że chcesz połączyć się z bazą danych Postgres. Możesz zainstalować Złącze psycopg2 używając pipa:

pip install psycopg2

 

Możesz używać zarówno połączenia, jak i obiektów kursora w instrukcjach, jak pokazano:

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)

 

W tym kodzie:

  • Używamy with instrukcja tworząca kontekst do zarządzania połączeniem z bazą danych. 
  • Wewnątrz tego kontekstu tworzymy kolejny kontekst do zarządzania kursorem bazy danych. Kursor zamyka się automatycznie po wyjściu z tego wewnętrznego kontekstu.
  • Ponieważ połączenie jest również zamykane po wyjściu z kontekstu zewnętrznego, konstrukcja ta zapewnia prawidłowe zarządzanie zarówno połączeniem, jak i kursorem, co zmniejsza ryzyko wycieków zasobów.

Podobnej konstrukcji możesz użyć także podczas pracy z bazami danych SQLite i MySQL.

Moduł podprocesu Pythona zapewnia funkcjonalność uruchamiania poleceń zewnętrznych w skrypcie Pythona. The subprocess.Popen() konstruktor tworzy nowy podproces. Którego możesz użyć w with stwierdzenie takie:

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)

 

Tutaj uruchamiamy polecenie Bash ls -l polecenie, aby wyświetlić długą listę plików w bieżącym katalogu:

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

 

Zasoby powiązane z podprocesem są zwalniane, gdy wykonanie wyjdzie z kontekstu with komunikat. 

Wbudowany typ danych float w Pythonie nie nadaje się do precyzyjnej arytmetyki zmiennoprzecinkowej. Jednak praca z danymi finansowymi, odczytami czujników i tym podobnymi wymaga dużej precyzji. Do takich zastosowań można użyć dziesiętny zamiast tego moduł. 

Połączenia localcontext() funkcjonować zwraca menedżera kontekstu. Możesz więc skorzystać z localcontext() funkcja w with instrukcję i ustaw precyzję dla bieżącego kontekstu, używając jak pokazano:

from decimal import Decimal, localcontext

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

 

Oto wynik:

Output >>>
0.6666666666666666666666666666666666666667

 

Tutaj dokładność jest ustawiona na 40 miejsc po przecinku, ale tylko w tym zakresie with blok. Kiedy wykonanie opuszcza bieżący kontekst, precyzja jest przywracana do domyślnej precyzji (28 miejsc po przecinku).

W tym samouczku dowiedzieliśmy się, jak można używać menedżerów kontekstów do obsługi połączeń z bazami danych, zarządzania podprocesami i kontekstami w precyzyjnej arytmetyce zmiennoprzecinkowej.

W następnym samouczku zobaczymy, jak możemy tworzyć niestandardowe menedżery kontekstów w Pythonie. Do tego czasu, szczęśliwego kodowania!
 
 

Bala Priya C jest deweloperem i pisarzem technicznym z Indii. Lubi pracować na styku matematyki, programowania, data science i tworzenia treści. Jej obszary zainteresowań i wiedzy obejmują DevOps, data science i przetwarzanie języka naturalnego. Lubi czytać, pisać, kodować i kawę! Obecnie pracuje nad zdobywaniem wiedzy i dzieleniem się nią ze społecznością programistów, tworząc samouczki, poradniki, opinie i nie tylko.

Znak czasu:

Więcej z Knuggety