Python Academy · Pelajaran

Pernyataan with secara Mendalam

Fahami cara with berfungsi dan sebabnya mencegah kebocoran sumber.

Pelajaran 1 daripada 414 langkah

Pernyataan with secara Mendalam ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 1 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.

Pengenalan

Pernyataan with menjamin kod persediaan dan pengemasan dijalankan walaupun pengecualian berlaku.

Penggunaan Asas with

with expr as var: — expr mesti mengembalikan pengurus konteks. var terikat kepada apa sahaja yang dikembalikan oleh __enter__.
with open('/tmp/cm_test.txt','w') as f:
    f.write('hello')
print('file closed:', f.closed)

Mengapa with Wujud

Sumber seperti fail, kunci dan sambungan pangkalan data mesti dilepaskan. with menjamin pembersihan walaupun pengecualian mengganggu badan pernyataan.
# Without with:
# f = open('f.txt')
# try: ...
# finally: f.close()
# With with:
# with open('f.txt') as f: ...
print('with is cleaner')

Berbilang Pengurus Konteks

with open(a) as f, open(b) as g: membuka dua sumber dalam satu pernyataan. Kedua-duanya ditutup apabila keluar.
import tempfile, os
a = tempfile.mktemp(); b = tempfile.mktemp()
with open(a,'w') as fa, open(b,'w') as fb:
    fa.write('A'); fb.write('B')
os.unlink(a); os.unlink(b)
print('both closed')

with Tidak Menyembunyikan Pengecualian

Secara lalai, pengecualian dalam badan with disebarkan. __exit__ boleh menyembunyikannya dengan mengembalikan True.
try:
    with open('/nonexistent.txt') as f:
        pass
except FileNotFoundError as e:
    print('caught:', e)

Lock sebagai Pengurus Konteks

threading.Lock() berfungsi sebagai pengurus konteks: with lock: memastikan kunci sentiasa dilepaskan.
import threading
lock = threading.Lock()
with lock:
    print('locked section')
print('lock released')

Corak Sambungan Pangkalan Data

Sambungan pangkalan data sebagai pengurus konteks melakukan commit apabila berjaya dan rollback apabila berlaku pengecualian — corak yang penting.
# Typical DB pattern:
# with db.transaction() as conn:
#     conn.execute(sql)
# commits on success, rolls back on exception
print('db pattern demo')

Pernyataan with Bersarang

Pernyataan with bersarang tidak menjadi masalah. Pengurus konteks dalaman keluar dahulu, kemudian pengurus konteks luaran.
import tempfile
tmp = tempfile.mktemp()
with open(tmp,'w') as outer:
    with open(tmp,'r+') as inner:
        outer.write('x')
import os; os.unlink(tmp)
print('nested exit order')

contextlib.suppress

contextlib.suppress(ExcType) menyembunyikan jenis pengecualian tertentu secara senyap di dalam blok with.
from contextlib import suppress
with suppress(FileNotFoundError):
    open('/does/not/exist.txt')
print('no error raised')

contextlib.redirect_stdout

contextlib.redirect_stdout(f) mengalihkan output print() ke f buat sementara waktu.
from contextlib import redirect_stdout
import io
buf = io.StringIO()
with redirect_stdout(buf):
    print('captured')
print('got:', buf.getvalue())

ExitStack

contextlib.ExitStack mengurus bilangan pengurus konteks yang dinamik — berguna apabila anda tidak tahu berapa banyak fail yang perlu dibuka.
from contextlib import ExitStack
import tempfile, os
with ExitStack() as stack:
    files = [stack.enter_context(open(tempfile.mktemp(),'w')) for _ in range(3)]
    for f in files: f.write('x')
print('all closed')

Semakan Pantas

Apakah yang dilakukan oleh contextlib.suppress(FileNotFoundError)?

Imbas Kembali

with menjamin pembersihan. Berbilang sasaran boleh digunakan dalam satu with. contextlib.suppress menyenyapkan ralat tertentu. ExitStack mengurus bilangan pengurus konteks yang dinamik.

Teruskan

Kerja yang baik! Pelajaran seterusnya menanti.
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 “Pernyataan with secara Mendalam” percuma?

Ya — teks penuh “Pernyataan with secara Mendalam” 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 “Pernyataan with secara Mendalam”?

Fahami cara with berfungsi dan sebabnya mencegah kebocoran sumber. 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 1 daripada 4.

Berapa lamakah pelajaran “Pernyataan with secara Mendalam” 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