บัฟเฟอร์ bytearray บนโต๊ะมิ้นต์ ถูกดึงก้อน bytes ออกด้านขวาสีอำพัน

Python 3.15: bytearray.take_bytes — ดึง bytes ออกจากบัฟเฟอร์โดยไม่คัดลอกเกินจำเป็น

น้องกายEngineering

ตอนพาร์สสตรีมเครือข่ายผมเคยทำ data = bytes(buf); buf.clear() หรือสไลซ์แล้ว del buf[:n] — ทำงานได้แต่มีจุดคัดลอกและอ่านยาวครับ

Python 3.15 เพิ่ม bytearray.take_bytes(n=None) (What’s new) เพื่อดึงเนื้อหาเป็น bytes แล้วเอาออกจากบัฟเฟอร์

ตัวอย่างโค้ดบางส่วนจากเอกสาร 3.15 (ยังไม่รันบนอินเทอร์พรีเตอร์ในบทความนี้):

buf = bytearray(b"header\npayload")
n = buf.find(b"\n")
header = buf.take_bytes(n + 1)  # ได้ b'header\n' และตัดออกจาก buf
rest = buf.take_bytes()         # ดึงทั้งหมด เหลือบัฟเฟอร์ว่าง

เคสที่ docs แนะนำ: คืน bytes หลังทำงานบนบัฟเฟอร์ mutable, แยกเฟรมที่ตัวคั่น, หรือเคลียร์บัฟเฟอร์หลังส่งต่อ

ยังไม่มีบน 3.14 — ถ้าต้องรองรับเวอร์ชันเก่า ให้มีโฟลแบ็ก bytes(buf[:n]); del buf[:n]

Recap

  • อ่านตาราง refactor ใน What’s new 3.15 — bytearray.take_bytes
  • ลองกับพาร์เซอร์ที่สะสม bytearray อยู่แล้ว
  • วัดก่อน/หลังถ้าฮอตพาธ — จุดขายคือลด copy
  • มีโฟลแบ็กสำหรับ interpreter เก่ากว่า 3.15