Python Academy · Oppitunti

contextlib: @contextmanager

Luokaa kontekstinhallitsijoita tiiviisti contextlib-dekoraattorilla.

Oppitunti 3/413 vaihetta

contextlib: @contextmanager on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Miksi contextlib?

contextlib.contextmanager mahdollistaa kontekstinhallinnan kirjoittamisen generaattorifunktiona luokan sijaan, mikä vähentää toistuvaa koodia.

from contextlib import contextmanager

@contextmanager
def managed():
    print("setup")
    yield
    print("teardown")

with managed():
    print("inside")

Arvon palauttaminen yield-käskyllä

Arvo, jonka suoritatte yield-käskyllä, sidotaan with-lauseen as-muuttujaan.

from contextlib import contextmanager

@contextmanager
def temp_list():
    lst = []
    yield lst
    print(f"Final list: {lst}")

with temp_list() as lst:
    lst.append(1)
    lst.append(2)

Poikkeusten käsittely @contextmanagerissa

Sijoittakaa yield try/finally-rakenteen sisään, jotta siivous suoritetaan varmasti myös poikkeuksen tapahtuessa.

from contextlib import contextmanager

@contextmanager
def safe_open(path):
    f = open(path)
    try:
        yield f
    finally:
        f.close()

with safe_open("data.txt") as f:
    print(f.read())

Poikkeusten vaimentaminen

Siepatkaa poikkeus generaattorin sisällä sen vaimentamiseksi — tämä vastaa arvon True palauttamista metodista __exit__.

from contextlib import contextmanager

@contextmanager
def ignore_value_errors():
    try:
        yield
    except ValueError:
        pass

with ignore_value_errors():
    raise ValueError("ignored")

contextlib.suppress

contextlib.suppress(*exceptions) on valmis kontekstinhallinta, joka vaimentaa määritetyt poikkeustyypit.

from contextlib import suppress

with suppress(FileNotFoundError):
    open("missing.txt")

print("continues")

contextlib.closing

closing(obj) luo kontekstinhallinnan, joka kutsuu poistuessaan metodia obj.close(). Se on hyödyllinen olioille, joissa on close() mutta ei metodia __exit__.

from contextlib import closing
from urllib.request import urlopen

with closing(urlopen("https://example.com")) as page:
    content = page.read()

contextlib.nullcontext

nullcontext on toimenpiteitä tekemätön kontekstinhallinta. Se on hyödyllinen, kun kontekstinhallinnan käyttö on valinnaista.

from contextlib import nullcontext

def process(data, lock=None):
    cm = lock if lock is not None else nullcontext()
    with cm:
        return [x*2 for x in data]

contextlib.ExitStack

ExitStack mahdollistaa vaihtelevan kontekstinhallintojen määrän dynaamisen hallinnan.

from contextlib import ExitStack

files = ["a.txt", "b.txt", "c.txt"]
with ExitStack() as stack:
    handles = [stack.enter_context(open(f)) for f in files]
    data = [h.read() for h in handles]

@contextmanagerin käyttäminen uudelleen

Generaattoripohjaista kontekstinhallintaa voi käyttää kerran kutakin kutsua kohden. Kutsukaa koristeltua funktiota uudelleen, kun haluatte käyttää sitä uudelleen.

from contextlib import contextmanager

@contextmanager
def counter():
    count = 0
    yield lambda: count.__add__  # each call is independent
    print("done")

with counter():
    pass
with counter():
    pass

asynccontextmanager

Asynkronisessa koodissa käyttäkää contextlib.asynccontextmanager-koristetta generaattoreina toteutettavien async with-hallintojen kirjoittamiseen.

from contextlib import asynccontextmanager

@asynccontextmanager
async def async_session():
    session = await create_session()
    try:
        yield session
    finally:
        await session.close()

contextlib.redirect_stdout

Ohjatkaa vakiotuloste väliaikaisesti mihin tahansa tiedostoa muistuttavaan olioon.

import io
from contextlib import redirect_stdout

buf = io.StringIO()
with redirect_stdout(buf):
    print("captured")

print(buf.getvalue())  # captured

Pikatarkistus

Mihin siivouskoodi pitäisi sijoittaa @contextmanager-generaattorissa, jotta se suoritetaan varmasti myös poikkeuksen tapahtuessa?

Kertaus

@contextmanager muuntaa generaattorin kontekstinhallinnaksi. Käyttäkää yield-käskyn ympärillä try/finally-rakennetta varmistaaksenne turvallisen siivouksen. contextlib-moduuli tarjoaa myös suppress-, nullcontext- ja ExitStack-toiminnot sekä paljon muuta.

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 ”contextlib: @contextmanager” ilmainen?

Kyllä – oppitunnin ”contextlib: @contextmanager” 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 ”contextlib: @contextmanager”?

Luokaa kontekstinhallitsijoita tiiviisti contextlib-dekoraattorilla. 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 3/4.

Kuinka kauan ”contextlib: @contextmanager”-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