0Pricing
Python Academy · Pelajaran

contextlib: @contextmanager

Buat pengelola konteks secara ringkas dengan decorator contextlib.

contextlib: @contextmanager adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.

Mengapa contextlib?

contextlib.contextmanager memungkinkan Anda menulis pengelola konteks sebagai fungsi generator, bukan kelas, sehingga kode berulang berkurang.

from contextlib import contextmanager

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

with managed():
    print("inside")

Menghasilkan Nilai

Apa pun yang Anda yield akan ditetapkan ke variabel 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)

Penanganan Pengecualian dalam @contextmanager

Bungkus yield dalam try/finally untuk menjamin pembersihan tetap dilakukan meskipun terjadi pengecualian.

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

Menekan Pengecualian

Tangkap pengecualian di dalam generator untuk menekannya — sama seperti mengembalikan True dari __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) adalah pengelola konteks siap pakai yang menekan jenis pengecualian tertentu.

from contextlib import suppress

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

print("continues")

contextlib.closing

closing(obj) membuat pengelola konteks yang memanggil obj.close() saat keluar. Ini berguna untuk objek yang memiliki close() tetapi tidak memiliki __exit__.

from contextlib import closing
from urllib.request import urlopen

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

contextlib.nullcontext

nullcontext adalah pengelola konteks tanpa operasi. Ini berguna ketika pengelola konteks bersifat opsional.

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 memungkinkan Anda mengelola sejumlah pengelola konteks yang berubah-ubah secara dinamis.

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 Kembali @contextmanager

Pengelola konteks berbasis generator hanya dapat digunakan sekali untuk setiap pemanggilan. Panggil kembali fungsi yang diberi dekorator untuk menggunakannya lagi.

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 kode asinkron, gunakan contextlib.asynccontextmanager untuk menulis pengelola async with sebagai generator.

from contextlib import asynccontextmanager

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

contextlib.redirect_stdout

Alihkan keluaran standar ke objek apa pun yang menyerupai berkas untuk sementara.

import io
from contextlib import redirect_stdout

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

print(buf.getvalue())  # captured

Pemeriksaan Singkat

Dalam generator @contextmanager, di mana kode pembersihan harus ditempatkan agar dijamin tetap dijalankan meskipun terjadi pengecualian?

Ringkasan

@contextmanager mengubah generator menjadi pengelola konteks. Gunakan try/finally di sekitar yield untuk pembersihan yang aman. Modul contextlib juga menyediakan suppress, nullcontext, ExitStack, dan lainnya.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “contextlib: @contextmanager” gratis?

Ya — teks lengkap “contextlib: @contextmanager” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “contextlib: @contextmanager”?

Buat pengelola konteks secara ringkas dengan decorator contextlib. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Python Academy?

Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “contextlib: @contextmanager” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pernyataan with secara Mendalam
  2. Protokol __enter__ dan __exit__
  3. contextlib: @contextmanager
  4. Pola Pengelola Konteks Praktis
← Kembali ke Python Academy