Python Academy · Oppitunti

Käytännön kontekstinhallitsijamallit

Soveltakaa kontekstinhallitsijoita tiedostoihin, lukkoihin, ajastimiin ja tietokantayhteyksiin.

Oppitunti 4/414 vaihetta

Käytännön kontekstinhallitsijamallit on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/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

Kontekstinhallinnat ratkaisevat tiedostojen, tietokantojen, lukkojen, ajastinten ja muiden resurssien hallintaan liittyviä käytännön ongelmia elegantisti.

Tiedostojen käsittelyputki

Avatkaa syöte- ja tulostiedostot yhdessä, käsitelkää ne rivi kerrallaan ja sulkekaa molemmat automaattisesti.
import io
src = io.StringIO('line1\nline2\nline3')
dst = io.StringIO()
with src, dst:
    for line in src:
        dst.write(line.upper())
print(dst.getvalue())

Tietokantatransaktio

Käärikää tietokantatoiminnot kontekstinhallintaan: vahvistakaa transaktio onnistumisen jälkeen, peruuttakaa se poikkeuksen tapahtuessa ja sulkekaa yhteys aina.
from contextlib import contextmanager
@contextmanager
def db_transaction(conn):
    try:
        yield conn
        print('COMMIT')
    except Exception as e:
        print(f'ROLLBACK: {e}')
        raise
    finally:
        print('CLOSE')
with db_transaction({'execute': lambda q: print(f'SQL: {q}')}) as db:
    db['execute']('INSERT ...')

Säikeistyslukko

with lock: hankkii lukon, suorittaa lohkon ja vapauttaa lukon poistuessaan — manuaalisia acquire- ja release-kutsuja ei tarvita.
import threading
lock = threading.Lock()
shared = []
def add(x):
    with lock:
        shared.append(x)
add(1); add(2)
print(shared)

Työhakemiston vaihtaminen

os.chdir() vaihtaa työhakemiston maailmanlaajuisesti. Kontekstinhallinta tallentaa työhakemiston ja palauttaa sen ennalleen.
from contextlib import contextmanager
import os
@contextmanager
def chdir(path):
    old = os.getcwd()
    os.chdir(path)
    try: yield
    finally: os.chdir(old)
original = os.getcwd()
with chdir('/tmp'):
    print('in tmp:', os.getcwd())
print('back:', os.getcwd())

Väliaikaiset tiedostot

tempfile.NamedTemporaryFile kontekstinhallintana luo ja poistaa väliaikaisen tiedoston automaattisesti.
import tempfile
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=True) as f:
    f.write('temp data')
    print('temp file:', f.name)
print('deleted')

Ympäristömuuttujan tilapäinen muuttaminen

Asettakaa ympäristömuuttuja väliaikaisesti testiä tai aliprosessia varten ja palauttakaa sen jälkeen alkuperäinen arvo.
from contextlib import contextmanager
import os
@contextmanager
def env(**kwargs):
    old = {k: os.environ.get(k) for k in kwargs}
    os.environ.update({k:str(v) for k,v in kwargs.items()})
    try: yield
    finally:
        for k,v in old.items():
            if v is None: os.environ.pop(k,None)
            else: os.environ[k]=v
with env(DEBUG='1', LOG_LEVEL='DEBUG'):
    print(os.environ['DEBUG'])

Profilointilohko

Käärikää lohko cProfilella ja mitatkaa sen suorituskykyä kontekstinhallinnan sisällä.
from contextlib import contextmanager
import cProfile
@contextmanager
def profile():
    pr = cProfile.Profile()
    pr.enable()
    yield pr
    pr.disable()
with profile() as pr:
    sum(range(1000000))
print('profiled')

Verkkopistoke

Pistokkeet toteuttavat kontekstinhallintaprotokollan: with socket.socket() as s: sulkee pistokkeen poistuttaessa.
import socket
try:
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(0.1)
        print('socket ready')
except Exception as e:
    print(f'socket: {e}')

Varoitusten sieppaaminen

warnings.catch_warnings() sieppaa lohkon sisällä tuotetut varoitukset, mikä on hyödyllistä testeissä.
import warnings
with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter('always')
    warnings.warn('test warning')
print(len(w), w[0].category.__name__)

Mallien yhdistäminen

Käytännön kontekstinhallinnoissa yhdistetään usein useita malleja: transaktio, lokitus ja ajan mittaus yhdeksi uudelleenkäytettäväksi komponentiksi.
from contextlib import contextmanager
import time
@contextmanager
def timed_operation(name):
    print(f'[{name}] start')
    t0 = time.perf_counter()
    try:
        yield
        print(f'[{name}] done in {time.perf_counter()-t0:.4f}s')
    except Exception as e:
        print(f'[{name}] failed: {e}')
        raise
with timed_operation('loop'):
    sum(range(100000))

Pikatarkistus

Mikä säikeistyksen primitiivi toteuttaa kontekstinhallintaprotokollan turvallista samanaikaista käyttöä varten?

Kertaus

Kontekstinhallintamalleja: tiedostoputket, tietokantatransaktiot, lukot, hakemiston vaihtaminen, väliaikaiset tiedostot, ympäristömuuttujien tilapäiset muutokset ja profilointi. Käyttäkää ExitStackia dynaamisiin resurssipinoihin.

Jatkakaa

Hienosti tehty! 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 ”Käytännön kontekstinhallitsijamallit” ilmainen?

Kyllä – oppitunnin ”Käytännön kontekstinhallitsijamallit” 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 ”Käytännön kontekstinhallitsijamallit”?

Soveltakaa kontekstinhallitsijoita tiedostoihin, lukkoihin, ajastimiin ja tietokantayhteyksiin. 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 4/4.

Kuinka kauan ”Käytännön kontekstinhallitsijamallit”-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