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 โดยไม่ตั้งใจ