Python Academy · Oppitunti

with-lauseen perusteet

Ymmärtäkää, miten with toimii ja miksi se estää resurssivuodot.

Oppitunti 1/414 vaihetta

with-lauseen perusteet on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.

Johdanto

with-lauseke takaa, että alustava ja lopettava koodi suoritetaan myös poikkeusten tapahtuessa.

with-lausekkeen peruskäyttö

with expr as var: — expr:n on palautettava kontekstinhallintaolio. var sidotaan siihen, minkä __enter__ palauttaa.
with open('/tmp/cm_test.txt','w') as f:
    f.write('hello')
print('file closed:', f.closed)

Miksi with-lauseke on olemassa?

Tiedostojen, lukkojen ja tietokantayhteyksien kaltaiset resurssit on vapautettava. with takaa siivouksen, vaikka poikkeus keskeyttäisi rungon suorittamisen.
# Without with:
# f = open('f.txt')
# try: ...
# finally: f.close()
# With with:
# with open('f.txt') as f: ...
print('with is cleaner')

Useita kontekstinhallintaolioita

with open(a) as f, open(b) as g: avaa kaksi resurssia yhdessä lausekkeessa. Molemmat suljetaan poistuttaessa.
import tempfile, os
a = tempfile.mktemp(); b = tempfile.mktemp()
with open(a,'w') as fa, open(b,'w') as fb:
    fa.write('A'); fb.write('B')
os.unlink(a); os.unlink(b)
print('both closed')

with ei vaimenna poikkeuksia

Oletusarvoisesti with-rungossa tapahtuvat poikkeukset välitetään eteenpäin. __exit__ voi vaimentaa ne palauttamalla arvon True.
try:
    with open('/nonexistent.txt') as f:
        pass
except FileNotFoundError as e:
    print('caught:', e)

Lukko kontekstinhallintaoliona

threading.Lock() toimii kontekstinhallintaoliona: with lock: takaa, että lukko vapautetaan aina.
import threading
lock = threading.Lock()
with lock:
    print('locked section')
print('lock released')

Tietokantayhteyden malli

Kontekstinhallintaoliona käytetty tietokantayhteys vahvistaa muutokset onnistumisen jälkeen ja peruuttaa ne poikkeuksen tapahtuessa — kyseessä on tärkeä toimintamalli.
# Typical DB pattern:
# with db.transaction() as conn:
#     conn.execute(sql)
# commits on success, rolls back on exception
print('db pattern demo')

Sisäkkäiset with-lausekkeet

Sisäkkäiset with-lausekkeet ovat sallittuja. Sisempi kontekstinhallintaolio poistuu ensin ja sitten ulompi.
import tempfile
tmp = tempfile.mktemp()
with open(tmp,'w') as outer:
    with open(tmp,'r+') as inner:
        outer.write('x')
import os; os.unlink(tmp)
print('nested exit order')

contextlib.suppress

contextlib.suppress(ExcType) vaientaa hiljaisesti tietyn poikkeustyypin with-lohkon sisällä.
from contextlib import suppress
with suppress(FileNotFoundError):
    open('/does/not/exist.txt')
print('no error raised')

contextlib.redirect_stdout

contextlib.redirect_stdout(f) ohjaa print()-tulosteen tilapäisesti kohteeseen f.
from contextlib import redirect_stdout
import io
buf = io.StringIO()
with redirect_stdout(buf):
    print('captured')
print('got:', buf.getvalue())

ExitStack

contextlib.ExitStack hallitsee dynaamista määrää kontekstinhallintaolioita — se on hyödyllinen, kun avattavien tiedostojen määrää ei tiedetä etukäteen.
from contextlib import ExitStack
import tempfile, os
with ExitStack() as stack:
    files = [stack.enter_context(open(tempfile.mktemp(),'w')) for _ in range(3)]
    for f in files: f.write('x')
print('all closed')

Pikatarkistus

Mitä contextlib.suppress(FileNotFoundError) tekee?

Kertaus

with takaa siivouksen. Yhdessä with-lausekkeessa voi olla useita kohteita. contextlib.suppress vaientaa tietyt virheet. ExitStack hallitsee dynaamisia määriä kontekstinhallintaolioita.

Jatka

Hienoa työtä! Seuraava oppitunti odottaa.
Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
76
Oppitunnit
320

Usein kysytyt kysymykset

Onko oppitunti ”with-lauseen perusteet” ilmainen?

Kyllä – oppitunnin ”with-lauseen perusteet” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”with-lauseen perusteet”?

Ymmärtäkää, miten with toimii ja miksi se estää resurssivuodot. Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”with-lauseen perusteet”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?

Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. with-lauseen perusteet
  2. __enter__- ja __exit__-protokolla
  3. contextlib: @contextmanager
  4. Käytännön kontekstinhallitsijamallit
← Takaisin: Python Academy