logo

su pareiškimu Python

Python, su pareiškimu naudojamas išimčių tvarkymui, kad kodas būtų švaresnis ir lengviau skaitomas. Tai supaprastina bendrų išteklių, pvz., failų srautų, valdymą. Atkreipkite dėmesį į šį kodo pavyzdį, kaip naudojant teiginį su kodas tampa švaresnis.

Python3




konvertuoti int į eilutę c++





# 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 !'>)>

>

>

javascript arčiausiai

Atkreipkite dėmesį, kad skirtingai nei pirmieji du diegimai, naudojant su sakiniu, nereikia iškviesti file.close(). Pats su teiginys užtikrina tinkamą išteklių įsigijimą ir išleidimą. Išimtis iškviečiant file.write() pirmą kartą gali neleisti tinkamai uždaryti failo, o tai gali sukelti keletą kodo klaidų, t. y. daugelis failų pakeitimų neįsigalioja tol, kol failas tinkamai neuždaromas. Antrasis aukščiau pateiktame pavyzdyje pateiktas metodas pasirūpina visomis išimtimis, tačiau naudojant teiginį su kodas tampa kompaktiškas ir daug lengviau skaitomas. Taigi pareiškimas padeda išvengti klaidų ir nutekėjimų, nes užtikrina, kad išteklius būtų tinkamai išleistas, kai visiškai vykdomas išteklius naudojantis kodas. Teiginys su populiariai naudojamas su failų srautais, kaip parodyta aukščiau, ir su užraktais, lizdais, subprocesais ir telnetais ir kt.

Teiginio su palaikymas vartotojo apibrėžtuose objektuose

Open() nėra nieko ypatingo, todėl jį galima naudoti su teiginiu, o tą pačią funkciją galima pateikti vartotojo apibrėžtuose objektuose. Palaikymas su pareiškimu savo objektuose užtikrins, kad niekada nepaliksite atvirų išteklių. Norėdami naudoti su teiginiu vartotojo apibrėžtuose objektuose, objekto metoduose tereikia pridėti metodus __enter__() ir __exit__(). Norėdami daugiau paaiškinti, apsvarstykite šį pavyzdį.

Python3




# 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'>)>

>

>

Panagrinėkime aukščiau pateiktą kodą. Jei pastebėsite, po raktinio žodžio su yra MessageWriter konstruktorius. Kai tik vykdymas patenka į teiginio with kontekstą, sukuriamas MessageWriter objektas ir python iškviečia __enter__() metodą. Šiuo __enter__() metodu inicijuokite išteklius, kuriuos norite naudoti objekte. Šis __enter__() metodas visada turi grąžinti įgyto šaltinio aprašą. Kas yra išteklių aprašai? Tai yra operacinės sistemos pateiktos rankenos, leidžiančios pasiekti prašomus išteklius. Šiame kodo bloke failas yra failo srauto šaltinio aprašas.

Python




java vartotojo įvestis
file> => open>(>'hello.txt'>)>

>

>

Aukščiau pateiktame MessageWriter pavyzdyje __enter__() metodas sukuria failo aprašą ir jį grąžina. Pavadinimas xfile čia naudojamas norint nurodyti failo aprašą, grąžintą metodu __enter__(). Kodo blokas, kuris naudoja įgytus išteklius, dedamas į su teiginio bloką. Kai tik įvykdomas su bloko viduje esantis kodas, iškviečiamas __exit__() metodas. Visi gauti ištekliai išleidžiami naudojant __exit__() metodą. Taip mes naudojame teiginį with su vartotojo apibrėžtais objektais. Ši __enter__() ir __exit__() metodų sąsaja, teikianti teiginio palaikymą vartotojo apibrėžtuose objektuose, vadinama Konteksto tvarkyklė .

Contextlib modulis

Klase pagrįsta konteksto tvarkyklė, kaip parodyta aukščiau, nėra vienintelis būdas palaikyti su teiginiu vartotojo apibrėžtuose objektuose. The kontekstinis lib modulis pateikia dar keletą abstrakcijų, sukurtų remiantis pagrindine konteksto tvarkyklės sąsaja. Štai kaip galime perrašyti MessageWriter objekto konteksto tvarkyklę naudodami kontekstinio lib modulį.

Java duomenų struktūros

Python3




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'>)>

>

>

Šiame kodo pavyzdyje dėl derlius teiginio apibrėžime funkcija open_file() yra a generatoriaus funkcija . Kai iškviečiama ši funkcija open_file(), ji sukuria išteklių aprašą pavadinimu failas. Tada šis išteklių aprašas perduodamas skambinančiajam ir čia yra pavaizduotas kintamuoju my_file. Įvykdžius kodą su bloko viduje, programos valdymas grįžta į funkciją open_file(). Funkcija open_file() atnaujina savo vykdymą ir vykdo kodą po pajamingumo teiginio. Ši kodo dalis, atsirandanti po pajamingumo ataskaitos, išleidžia įgytus išteklius. @contextmanager čia yra a dekoratorius . Ankstesnis klasėmis pagrįstas konteksto tvarkyklių diegimas ir šis generatoriumi pagrįstas diegimas viduje yra vienodi. Nors vėlesnis atrodo skaitomesnis, jam reikia generatorių, dekoratorių ir derliaus žinių.