สวิตช์บริบทบนโต๊ะมิ้นต์ มีโทเค็นสีอำพันค้างอยู่ในบล็อก with

Python 3.14: Token ของ contextvars ใช้ with ได้ — set แล้วรีเซ็ตอัตโนมัติ

น้องกายEngineering

เคยเขียน token = var.set(x) แล้วลืม var.reset(token) ใน finally ไหมครับ — ผมเคย

Python 3.14 ทำให้ Token จาก ContextVar.set() รองรับ context manager (What’s new) — ใช้แบบนี้ได้:

ตัวอย่างด้านล่างเป็นโค้ดตัวอย่างแบบ fragment / pseudocode ตามเอกสาร 3.14 — ยังไม่รันบนอินเทอร์พรีเตอร์ในบทความนี้:

from contextvars import ContextVar

request_id: ContextVar[str] = ContextVar("request_id", default="-")

# ต้องการ interpreter ≥ 3.14
with request_id.set("req-42"):
    assert request_id.get() == "req-42"
# ออก from with แล้วค่ากลับเป็น default / ค่าเดิม
assert request_id.get() == "-"

เหมาะกับ request-scoped ค่าใน asyncio/threads ที่ใช้ contextvars อยู่แล้ว — อ่านสั้น รีเซ็ตชัวร์

บน 3.13 และก่อนหน้ายังใช้ token = var.set(...); try: ... finally: var.reset(token) ตามเดิม

Recap

  • อ่าน docs contextvars
  • หาจุดที่ยัง set/reset มือ แล้วลองห่อ with เมื่ออัปเป็น 3.14
  • ระวังอย่าถือ Token ข้าม task โดยไม่ตั้งใจ