contextlib: @contextmanager
Cipta pengurus konteks dengan ringkas menggunakan penghias contextlib.
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():
passasynccontextmanager
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()) # capturedSemakan 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.
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
- Pernyataan with secara Mendalam
- Protokol __enter__ dan __exit__
- contextlib: @contextmanager
- Corak Pengurus Konteks Praktikal