contextlib: @contextmanager
Luokaa kontekstinhallitsijoita tiiviisti contextlib-dekoraattorilla.
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():
passasynccontextmanager
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()) # capturedPikatarkistus
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.
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
- with-lauseen perusteet
- __enter__- ja __exit__-protokolla
- contextlib: @contextmanager
- Käytännön kontekstinhallitsijamallit