Pythoni kontekstihaldurite 3 huvitavat kasutusviisi – KDnuggets

3 Pythoni kontekstihaldurite huvitavat kasutust – KDnuggets

Allikasõlm: 3084989

3 Pythoni kontekstihaldurite huvitavat kasutust
Pildi autor johnstocker on Freepik
 

Mõni aeg tagasi kirjutasin õpetuse tõhusa Pythoni koodi kirjutamine. Selles rääkisin kontekstihaldurite ja koos-lause kasutamisest ressursside tõhusaks haldamiseks.

Kasutasin lihtsat failikäsitlemise näidet, et näidata, kuidas failid suletakse automaatselt, kui täitmine blokist with väljub – isegi kui on erand.

Kuigi failihaldus on hea esimene näide, võib see kiiresti igavaks muutuda. Seetõttu tahaksin selles õpetuses käsitleda muid huvitavaid kontekstihaldurite kasutusviise – peale failikäsitluse. Keskendume andmebaasiühenduste käsitlemisele, alamprotsesside haldamisele ja ülitäpsele ujukomaaritmeetikale.

Pythoni kontekstihaldurid võimaldavad teil ressurssidega töötamisel kirjutada puhtamat koodi. Need pakuvad kokkuvõtlikku süntaksit ressursside seadistamiseks ja eemaldamiseks järgmiselt.

  • An sisestama loogika, mis kutsutakse välja, kui täitmine siseneb konteksti ja
  • An väljumiseks loogika kutsutakse välja, kui täitmine väljub kontekstist 

Lihtsaim näide selle kohta on failihaldus. Siin kasutame open() toimib with avaldus failitöötleja hankimiseks:

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

 

See omandab ressursi - failiobjekti -, mida kasutatakse (me kirjutame faili) koodiplokis. Fail suletakse, kui täitmine kontekstist väljub; nii et ressursside lekkeid pole.

Selle üldise versiooni saate kirjutada järgmiselt:

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

# resource cleanup is automatic

 

Liigume nüüd konkreetsete näidete juurde.

Pythoni rakenduste loomisel on üsna tavaline andmebaasidega ühenduse loomine ja neis sisalduvate tabelite päringute tegemine. Ja töövoog selle tegemiseks näeb välja järgmine:

  • Andmebaasiga töötamiseks installige andmebaasi konnektor (nt psycopg2 Postgresi jaoks ja mysql-connector-python MySQL-i andmebaaside jaoks).
  • Ühenduse parameetrite toomiseks sõeluge konfiguratsioonifail. 
  • Kasuta connect() funktsioon andmebaasiga ühenduse loomiseks.

 

3 Pythoni kontekstihaldurite huvitavat kasutust
Ühendamine db | Pilt autorilt
 

Kui olete andmebaasiga ühenduse loonud, saate andmebaasi päringute tegemiseks luua andmebaasi. Käivitage päringuid ja tooge päringu tulemused, kasutades kursori käivitamise ja toomise meetodeid.

 

3 Pythoni kontekstihaldurite huvitavat kasutust
Päringu tegemine db | Pilt autorilt
 

Seda tehes loote järgmised ressursid: andmebaasiühendus ja andmebaasikursor. Nüüd kodeerime lihtsa üldise näite, et näha, kuidas saame ühendust ja kursoriobjekte kontekstihaldurina kasutada.

TOML-failide sõelumine Pythonis

Kaaluge TOML-i näidisfaili, näiteks db_config.toml, mis sisaldab andmebaasiga ühenduse loomiseks vajalikku teavet:

# db_config.toml

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

 

märkused: kasutamiseks vajate Pythoni versiooni 3.11 või uuemat versiooni tomllib.

 

Pythonil on sisseehitatud tomllib moodul (kasutusele võetud Python 3.11-s), mis võimaldab sõeluda TOML-faile. Nii saate avada faili db_config.toml ja sõeluda selle sisu järgmiselt:

import tomllib

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

 

Pange tähele, et me puudutame faili db_config.toml jaotist "andmebaas". The load() funktsioon tagastab Pythoni sõnastiku. Saate seda kontrollida, printides välja selle sisu credentials:

print(credentials)

 

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

Andmebaasi ühendamine

Oletame, et soovite luua ühenduse Postgresi andmebaasiga. Saate installida psycopg2 pistik pipi kasutades:

pip install psycopg2

 

Saate kasutada nii ühenduse kui ka kursori objekte koos lausetega, nagu näidatud:

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)

 

Selles koodis:

  • Me kasutame with avaldus andmebaasiühenduse haldamiseks konteksti loomiseks. 
  • Selles kontekstis loome andmebaasikursori haldamiseks teise konteksti. Sellest sisemisest kontekstist väljumisel suletakse kursor automaatselt.
  • Kuna ühendus suletakse ka välisest kontekstist väljumisel, tagab see konstruktsioon, et nii ühendust kui ka kursorit hallatakse õigesti, vähendades ressursside lekete võimalust.

Sarnast konstruktsiooni saate kasutada ka SQLite ja MySQL andmebaasidega töötades.

Pythoni alamprotsessimoodul pakub funktsiooni väliste käskude käitamiseks Pythoni skriptis. The subprocess.Popen() konstruktor loob uue alamprotsessi. Mida saate kasutada a with selline väide:

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)

 

Siin käivitame käsu Bash ls -l käsk praeguses kataloogis olevate failide pikaks loetlemiseks:

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

 

Alamprotsessiga seotud ressursid vabastatakse, kui täitmine väljub kontekstist with avalduses. 

Pythoni sisseehitatud ujukoma andmetüüp ei sobi ülitäpse ujukomaaritmeetika jaoks. Kuid finantsandmete, andurite näitude ja muu sarnasega töötamisel on vaja suurt täpsust. Selliste rakenduste jaoks saate kasutada Kümnendkoht mooduli asemel. 

. localcontext() funktsioon tagastab kontekstihalduri. Nii et saate kasutada localcontext() toimib with lause ja määrake praeguse konteksti täpsus, kasutades näidatud viisil:

from decimal import Decimal, localcontext

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

 

Siin on väljund:

Output >>>
0.6666666666666666666666666666666666666667

 

Siin on täpsuseks seatud 40 kohta pärast koma, kuid ainult selle piires with blokk. Kui täitmine väljub praegusest kontekstist, taastatakse täpsus vaiketäpsusele (28 kohta pärast koma).

Selles õpetuses õppisime, kuidas kontekstihaldureid saab kasutada andmebaasiühenduste haldamiseks, alamprotsesside ja kontekstide haldamiseks ülitäpses ujukomaaritmeetikas.

Järgmises õpetuses näeme, kuidas saame Pythonis kohandatud kontekstihaldureid luua. Seniks head kodeerimist!
 
 

Bala Priya C on Indiast pärit arendaja ja tehniline kirjanik. Talle meeldib töötada matemaatika, programmeerimise, andmeteaduse ja sisu loomise ristumiskohas. Tema huvialade ja teadmiste hulka kuuluvad DevOps, andmeteadus ja loomuliku keele töötlemine. Ta naudib lugemist, kirjutamist, kodeerimist ja kohvi! Praegu tegeleb ta õppimisega ja jagab oma teadmisi arendajakogukonnaga, koostades õpetusi, juhendeid, arvamuslugusid ja muud.

Ajatempel:

Veel alates KDnuggets