logo

lauseella Pythonissa

Pythonissa, lausunnon kanssa käytetään poikkeusten käsittelyssä, jotta koodista tulee selkeämpi ja luettavampi. Se yksinkertaistaa yleisten resurssien, kuten tiedostovirtojen, hallintaa. Tarkkaile seuraavaa koodiesimerkkiä, kuinka with-lauseen käyttö tekee koodista puhtaamman.

Python 3




analoginen viestintä





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



>

>

Python 3




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

>

>

Huomaa, että toisin kuin kahdessa ensimmäisessä toteutuksessa, tiedostoa file.close() ei tarvitse kutsua käytettäessä käskyn kanssa. Itse with-lauseke varmistaa resurssien asianmukaisen hankinnan ja vapauttamisen. Poikkeus file.write()-kutsun aikana ensimmäisessä toteutuksessa voi estää tiedostoa sulkeutumasta kunnolla, mikä voi aiheuttaa useita virheitä koodiin, eli monet tiedostojen muutokset eivät tule voimaan ennen kuin tiedosto on suljettu kunnolla. Yllä olevan esimerkin toinen lähestymistapa hoitaa kaikki poikkeukset, mutta with-lauseen käyttö tekee koodista kompaktin ja paljon luettavamman. Näin ollen lauseke auttaa välttämään virheitä ja vuotoja varmistamalla, että resurssi vapautetaan oikein, kun resurssia käyttävä koodi on suoritettu kokonaan. With-lausetta käytetään yleisesti tiedostovirtojen kanssa, kuten yllä on esitetty, sekä lukkojen, sockettien, aliprosessien ja telnetien jne. kanssa.

With-käskyn tukeminen käyttäjän määrittämissä objekteissa

Open():ssä ei ole mitään erikoista, mikä tekee siitä käyttökelpoisen with-käskyn kanssa, ja samat toiminnot voidaan tarjota käyttäjän määrittämissä objekteissa. Objekteissasi olevan lausunnon tukeminen varmistaa, että et koskaan jätä resursseja avoimeksi. Käyttääksesi käskyn kanssa käyttäjän määrittämissä objekteissa, sinun tarvitsee vain lisätä metodit __enter__() ja __exit__() objektimetodeihin. Tarkastele seuraavaa esimerkkiä saadaksesi lisäselvyyden.

Python 3




kuvien kohdistaminen css:ssä

nfa esimerkkejä
# 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'>)>

>

>

Tarkastellaan yllä olevaa koodia. Jos huomaat, kanssa-avainsanan jälkeen on MessageWriterin rakentaja. Heti kun suoritus tulee with-käskyn kontekstiin, luodaan MessageWriter-objekti ja python kutsuu sitten __enter__()-metodia. Tässä __enter__()-menetelmässä alusta resurssi, jota haluat käyttää objektissa. Tämän __enter__()-menetelmän tulee aina palauttaa hankitun resurssin kuvaaja. Mitä ovat resurssikuvaajat? Nämä ovat käyttöjärjestelmän tarjoamia kahvoja pyydettyjen resurssien käyttämiseksi. Seuraavassa koodilohkossa tiedosto on tiedostovirran resurssin kuvaaja.

Python




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

>

>

Yllä olevassa MessageWriter-esimerkissä menetelmä __enter__() luo tiedostokuvaajan ja palauttaa sen. Nimeä xfile käytetään tässä viittaamaan __enter__()-metodin palauttamaan tiedostokuvaajaan. Hankittua resurssia käyttävä koodilohko sijoitetaan with-lauseen lohkoon. Heti kun with-lohkon sisällä oleva koodi suoritetaan, __exit__() -metodi kutsutaan. Kaikki hankitut resurssit vapautetaan menetelmällä __exit__(). Näin käytämme with-lausetta käyttäjän määrittämien objektien kanssa. Tämä __enter__()- ja __exit__()-menetelmien käyttöliittymä, joka tarjoaa tuen käskylle käyttäjän määrittämissä objekteissa, on ns. Kontekstinhallinta .

Contextlib-moduuli

Yllä esitetty luokkapohjainen kontekstinhallinta ei ole ainoa tapa tukea with-käskyä käyttäjän määrittämissä objekteissa. The kontekstilib moduuli tarjoaa muutamia abstraktioita, jotka on rakennettu peruskontekstinhallintaliittymään. Näin voimme kirjoittaa uudelleen kontekstinhallinnan MessageWriter-objektille kontekstilib-moduulin avulla.

Python 3




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

voi androidilla pelata gamepigeonia

>

>

Tässä koodiesimerkissä, koska tuotto lausekkeen määritelmässä, funktio open_file() on a generaattoritoiminto . Kun tätä open_file()-funktiota kutsutaan, se luo resurssikuvaajan, jonka nimi on tiedosto. Tämä resurssikuvaaja välitetään sitten soittajalle, ja sitä edustaa tässä muuttuja my_file. Kun kanssa-lohkon sisällä oleva koodi on suoritettu, ohjelman ohjaus palaa takaisin open_file()-funktioon. Open_file()-funktio jatkaa suoritustaan ​​ja suorittaa tuottolauseketta seuraavan koodin. Tämä koodin osa, joka ilmestyy tuottolausunnon jälkeen, vapauttaa hankitut resurssit. @contextmanager täällä on a sisustusarkkitehti . Edellinen luokkapohjainen toteutus ja tämä generaattoripohjainen kontekstinhallintaohjelmien toteutus ovat sisäisesti samat. Vaikka jälkimmäinen näyttääkin luettavammalta, se vaatii tietämystä generaattoreista, sisustajista ja tuotosta.