Python Academy · Pelajaran

contextlib: @contextmanager

Cipta pengurus konteks dengan ringkas menggunakan penghias contextlib.

Pelajaran 3 daripada 413 langkah

contextlib: @contextmanager ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Python Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Mengapa contextlib?

contextlib.contextmanager membolehkan anda menulis pengurus konteks sebagai fungsi penjana dan bukannya kelas, sekali gus mengurangkan kod berulang.

from contextlib import contextmanager

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

with managed():
    print("inside")

Menghasilkan Nilai

Apa-apa sahaja yang anda yield akan diikat kepada pemboleh ubah as dalam pernyataan with.

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)

Pengendalian Pengecualian dalam @contextmanager

Bungkus yield dalam try/finally untuk menjamin pembersihan walaupun pengecualian berlaku.

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

Menyekat Pengecualian

Tangkap pengecualian di dalam penjana untuk menyekatnya — sama seperti memulangkan True daripada __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) ialah pengurus konteks sedia digunakan yang menyekat jenis pengecualian yang dinyatakan.

from contextlib import suppress

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

print("continues")

contextlib.closing

closing(obj) mencipta pengurus konteks yang memanggil obj.close() semasa keluar. Berguna untuk objek yang mempunyai close() tetapi tiada __exit__.

from contextlib import closing
from urllib.request import urlopen

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

contextlib.nullcontext

nullcontext ialah pengurus konteks tanpa operasi. Berguna apabila pengurus konteks adalah pilihan.

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 membolehkan anda mengurus bilangan pengurus konteks yang berubah-ubah secara dinamik.

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]

Menggunakan Semula @contextmanager

Pengurus konteks berasaskan penjana hanya boleh digunakan sekali bagi setiap panggilan. Panggil fungsi yang dihiasi itu sekali lagi untuk menggunakannya semula.

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

Untuk kod tak segerak, gunakan contextlib.asynccontextmanager untuk menulis pengurus async with sebagai penjana.

from contextlib import asynccontextmanager

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

contextlib.redirect_stdout

Halakan output piawai kepada mana-mana objek seperti fail buat sementara waktu.

import io
from contextlib import redirect_stdout

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

print(buf.getvalue())  # captured

Semakan Pantas

Dalam penjana @contextmanager, di manakah kod pembersihan perlu diletakkan untuk menjamin ia dijalankan walaupun berlaku pengecualian?

Ulang Kaji

@contextmanager menukarkan penjana kepada pengurus konteks. Gunakan try/finally di sekeliling yield untuk pembersihan yang selamat. Modul contextlib juga menyediakan suppress, nullcontext, ExitStack dan banyak lagi.

Percuma untuk bermula

Pelajari Python dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
76
Pelajaran
320

Soalan Lazim

Adakah pelajaran “contextlib: @contextmanager” percuma?

Ya — teks penuh “contextlib: @contextmanager” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Python Academy, tingkat taraf kepada CoddyKit PRO. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “contextlib: @contextmanager”?

Cipta pengurus konteks dengan ringkas menggunakan penghias contextlib. Anda berlatih Python Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Python Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Python Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “contextlib: @contextmanager” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pernyataan with secara Mendalam
  2. Protokol __enter__ dan __exit__
  3. contextlib: @contextmanager
  4. Corak Pengurus Konteks Praktikal
← Kembali ke Python Academy