Python Academy · บทเรียน

เจาะลึกคำสั่ง with

ทำความเข้าใจการทำงานของ with และเหตุผลที่ช่วยป้องกันทรัพยากรรั่วไหล

บทเรียน 1 จาก 414 ขั้นตอน

เจาะลึกคำสั่ง with เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

บทนำ

คำสั่ง with รับประกันว่าโค้ดสำหรับตั้งค่าและเก็บกวาดทรัพยากรจะทำงาน แม้จะเกิดข้อยกเว้นขึ้น

การใช้ with เบื้องต้น

with expr as var: — expr ต้องส่งคืนตัวจัดการบริบท ส่วน var จะผูกกับค่าที่ __enter__ ส่งคืน
with open('/tmp/cm_test.txt','w') as f:
    f.write('hello')
print('file closed:', f.closed)

เหตุผลที่มี with

ทรัพยากรอย่างไฟล์ ล็อก และการเชื่อมต่อฐานข้อมูลต้องได้รับการคืนทรัพยากร with รับประกันการล้างข้อมูล แม้ข้อยกเว้นจะขัดจังหวะส่วนเนื้อหาก็ตาม
# Without with:
# f = open('f.txt')
# try: ...
# finally: f.close()
# With with:
# with open('f.txt') as f: ...
print('with is cleaner')

ตัวจัดการบริบทหลายตัว

with open(a) as f, open(b) as g: เปิดทรัพยากรสองรายการในคำสั่งเดียว และทั้งสองรายการจะถูกปิดเมื่อออกจากบล็อก
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 ไม่ระงับข้อยกเว้น

โดยค่าเริ่มต้น ข้อยกเว้นในส่วนเนื้อหาของ with จะถูกส่งต่อ __exit__ สามารถระงับข้อยกเว้นได้ด้วยการคืนค่า True
try:
    with open('/nonexistent.txt') as f:
        pass
except FileNotFoundError as e:
    print('caught:', e)

Lock ในฐานะตัวจัดการบริบท

threading.Lock() ทำงานเป็นตัวจัดการบริบทได้: with lock: รับประกันว่าล็อกจะถูกปล่อยเสมอ
import threading
lock = threading.Lock()
with lock:
    print('locked section')
print('lock released')

รูปแบบการเชื่อมต่อฐานข้อมูล

การใช้การเชื่อมต่อฐานข้อมูลเป็นตัวจัดการบริบทจะ commit เมื่อสำเร็จ และ rollback เมื่อเกิดข้อยกเว้น ซึ่งเป็นรูปแบบสำคัญ
# Typical DB pattern:
# with db.transaction() as conn:
#     conn.execute(sql)
# commits on success, rolls back on exception
print('db pattern demo')

คำสั่ง with ซ้อนกัน

สามารถใช้คำสั่ง with ซ้อนกันได้ โดยตัวจัดการบริบทด้านในจะออกก่อน จากนั้นจึงเป็นตัวจัดการบริบทด้านนอก
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) จะกลืนข้อยกเว้นชนิดที่ระบุภายในบล็อก with อย่างเงียบ ๆ
from contextlib import suppress
with suppress(FileNotFoundError):
    open('/does/not/exist.txt')
print('no error raised')

contextlib.redirect_stdout

contextlib.redirect_stdout(f) จะเปลี่ยนเส้นทางผลลัพธ์จาก print() ไปยัง f ชั่วคราว
from contextlib import redirect_stdout
import io
buf = io.StringIO()
with redirect_stdout(buf):
    print('captured')
print('got:', buf.getvalue())

ExitStack

contextlib.ExitStack จัดการตัวจัดการบริบทจำนวนแบบไดนามิก เหมาะเมื่อยังไม่ทราบว่าจะต้องเปิดไฟล์กี่ไฟล์
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')

ตรวจสอบอย่างรวดเร็ว

contextlib.suppress(FileNotFoundError) ทำอะไร

ทบทวน

with รับประกันการล้างข้อมูล สามารถระบุเป้าหมายหลายรายการใน with เดียว contextlib.suppress ระงับข้อผิดพลาดเฉพาะรายการ และ ExitStack จัดการตัวจัดการบริบทจำนวนแบบไดนามิก

เรียนรู้ต่อไป

ทำได้ดีมาก บทเรียนถัดไปรอคุณอยู่
เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
76
บทเรียน
320

คำถามที่พบบ่อย

บทเรียน “เจาะลึกคำสั่ง with” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เจาะลึกคำสั่ง with” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เจาะลึกคำสั่ง with”

ทำความเข้าใจการทำงานของ with และเหตุผลที่ช่วยป้องกันทรัพยากรรั่วไหล คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “เจาะลึกคำสั่ง with” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เจาะลึกคำสั่ง with
  2. โพรโทคอล __enter__ และ __exit__
  3. contextlib: @contextmanager
  4. รูปแบบการใช้ตัวจัดการบริบทในทางปฏิบัติ
← กลับไปที่ Python Academy