logo

ar paziņojumu Python valodā

Python, ar paziņojumu tiek izmantots izņēmumu apstrādei, lai padarītu kodu tīrāku un daudz lasāmāku. Tas vienkāršo kopējo resursu, piemēram, failu straumju, pārvaldību. Ievērojiet tālāk sniegto koda piemēru par to, kā ar paziņojumu lietošana padara kodu tīrāku.

Python3




amiša patela





# file handling> # 1) without using with statement> file> => open>(>'file_path'>,>'w'>)> file>.write(>'hello world !'>)> file>.close()> # 2) without using with statement> file> => open>(>'file_path'>,>'w'>)> try>:> >file>.write(>'hello world'>)> finally>:> >file>.close()>



>

>

Python3




# using with statement> with>open>(>'file_path'>,>'w'>) as>file>:> >file>.write(>'hello world !'>)>

>

>

Ņemiet vērā, ka atšķirībā no pirmajām divām implementācijām, lietojot kopā ar paziņojumu, nav nepieciešams izsaukt file.close(). Pats ar paziņojums nodrošina pareizu resursu iegūšanu un atbrīvošanu. Izņēmums faila izsaukuma fail.write() laikā pirmajā ieviešanā var novērst faila pareizu aizvēršanu, kas var izraisīt vairākas kļūdas kodā, t.i., daudzas izmaiņas failos nestāsies spēkā, kamēr fails nav pareizi aizvērts. Otrā pieeja iepriekš minētajā piemērā rūpējas par visiem izņēmumiem, bet, izmantojot priekšrakstu ar, kods kļūst kompakts un daudz lasāmāks. Tādējādi paziņojums palīdz izvairīties no kļūdām un noplūdēm, nodrošinot, ka resurss tiek pareizi atbrīvots, kad kods, kas izmanto resursu, ir pilnībā izpildīts. Paziņojums with tiek plaši izmantots failu straumēs, kā parādīts iepriekš, kā arī ar slēdzenēm, ligzdām, apakšprocesiem un telnet utt.

Atbalsta ar paziņojumu lietotāja definētos objektos

Open() nav nekā īpaša, kas padara to lietojamu ar priekšrakstu ar, un to pašu funkcionalitāti var nodrošināt lietotāja definētajos objektos. Atbalsts ar paziņojumu savos objektos nodrošinās, ka nekad neatstāsit atvērtus resursus. Lai lietotu ar paziņojumu lietotāja definētajos objektos, objektu metodēs ir jāpievieno tikai metodes __enter__() un __exit__(). Apsveriet tālāk sniegto piemēru, lai iegūtu papildu skaidrojumu.

java lambda

Python3




sveiki pasaule java
# a simple file writer object> class> MessageWriter(>object>):> >def> __init__(>self>, file_name):> >self>.file_name>=> file_name> > >def> __enter__(>self>):> >self>.>file> => open>(>self>.file_name,>'w'>)> >return> self>.>file> >def> __exit__(>self>,>*>args):> >self>.>file>.close()> # using with statement with MessageWriter> with MessageWriter(>'my_file.txt'>) as xfile:> >xfile.write(>'hello world'>)>

>

>

Apskatīsim iepriekš minēto kodu. Ja pamanāt, tas, kas seko atslēgvārdam ar, ir MessageWriter konstruktors. Tiklīdz izpilde nonāk priekšraksta with kontekstā, tiek izveidots MessageWriter objekts, un python pēc tam izsauc __enter__() metodi. Izmantojot šo __enter__() metodi, inicializējiet resursu, kuru vēlaties izmantot objektā. Šai __enter__() metodei vienmēr jāatgriež iegūtā resursa deskriptors. Kas ir resursu deskriptori? Šie ir operētājsistēmas nodrošinātie rokturi, lai piekļūtu pieprasītajiem resursiem. Nākamajā koda blokā fails ir faila straumes resursa deskriptors.

Python




file> => open>(>'hello.txt'>)>

>

>

Iepriekš sniegtajā MessageWriter piemērā metode __enter__() izveido faila deskriptoru un atgriež to. Nosaukums xfile šeit tiek izmantots, lai atsauktos uz faila deskriptoru, kas atgriezts ar __enter__() metodi. Koda bloks, kas izmanto iegūto resursu, tiek ievietots priekšraksta ar blokā. Tiklīdz tiek izpildīts kods blokā ar, tiek izsaukta metode __exit__(). Visi iegūtie resursi tiek atbrīvoti, izmantojot metodi __exit__(). Tādā veidā mēs izmantojam priekšrakstu with ar lietotāja definētiem objektiem. Šo __enter__() un __exit__() metožu saskarni, kas nodrošina atbalstu ar paziņojumu lietotāja definētos objektos, sauc Kontekstu pārvaldnieks .

Contextlib modulis

Klases konteksta pārvaldnieks, kā parādīts iepriekš, nav vienīgais veids, kā atbalstīt ar paziņojumu lietotāja definētajos objektos. The kontekstlib modulis nodrošina vēl dažas abstrakcijas, kas balstītas uz pamata konteksta pārvaldnieka saskarni. Lūk, kā mēs varam pārrakstīt MessageWriter objekta konteksta pārvaldnieku, izmantojot konteksta lib moduli.

Python3

saraksti java




from> contextlib>import> contextmanager> class> MessageWriter(>object>):> >def> __init__(>self>, filename):> >self>.file_name>=> filename> >@contextmanager> >def> open_file(>self>):> >try>:> >file> => open>(>self>.file_name,>'w'>)> >yield> file> >finally>:> >file>.close()> # usage> message_writer>=> MessageWriter(>'hello.txt'>)> with message_writer.open_file() as my_file:> >my_file.write(>'hello world'>)>

>

>

Šajā koda piemērā, jo raža paziņojuma definīcijā funkcija open_file() ir a ģeneratora funkcija . Kad tiek izsaukta šī funkcija open_file(), tā izveido resursa deskriptoru ar nosaukumu fails. Pēc tam šis resursa deskriptors tiek nodots zvanītājam un šeit tiek attēlots ar mainīgo my_file. Pēc tam, kad ir izpildīts kods blokā ar, programmas vadība atgriežas pie funkcijas open_file(). Funkcija open_file() atsāk tās izpildi un izpilda kodu pēc ienesīguma paziņojuma. Šī koda daļa, kas parādās pēc ienesīguma paziņojuma, atbrīvo iegūtos resursus. @contextmanager šeit ir a dekorators . Iepriekšējā uz klasēm balstītā ieviešana un šī uz ģeneratoru balstītā konteksta pārvaldnieku ieviešana iekšēji ir vienāda. Lai gan vēlākais šķiet lasāmāks, tas prasa zināšanas par ģeneratoriem, dekoratoriem un ražu.