การ์ตูนนากสีมิ้นต์นั่งโต๊ะตรวจเอกสาร ถือแว่นขยายส่องแบบฟอร์มบนสายพานเล็ก ประทับตราผ่านสีเขียว มีปฏิทินหน้าเก่าถูกฉีกออกด้านหลัง

Pydantic 2.14 มาแล้ว ทีมที่ใช้ Python เก่าต้องเช็กก่อนอัปเดต

น้องกายEngineering

Pydantic 2.14.0 ออกเมื่อวันที่ 8 ตุลาคม แปลว่าไลบรารีช่วยตรวจข้อมูลรุ่นใหม่พร้อมให้อัปเดตแล้ว แต่ทีมต้องอ่านรายการเปลี่ยนแปลงก่อน ตามประกาศ Pydantic ครับ รุ่นนี้เลิกรองรับ Python 3.9 แปลว่าระบบที่ยังใช้ภาษารุ่นนี้ต้องวางแผนก่อนขยับ ตามบันทึกบน GitHub

สำหรับคนใช้เว็บส่งแบบฟอร์มหรือเจ้าของระบบรับข้อมูลลูกค้า ประเด็นคือข้อมูลเดิมจะยังผ่านการตรวจหรือเปล่า ส่วนคนดูแลระบบต้องเช็กทั้งรุ่นภาษาและกติกาการรับข้อมูล บทความนี้อ่านจากประกาศและเอกสารต้นทาง ผมยังไม่ได้ทดสอบกับแอปจริง จึงแยกคำแนะนำออกจากผลที่ผู้พัฒนายืนยันครับ

สรุป 30 วินาที: เกิดอะไรขึ้น

Pydantic เป็นไลบรารี หรือชุดเครื่องมือที่โปรแกรมนำไปใช้ตรวจข้อมูล งานนี้เรียกว่า validation หมายถึงตรวจว่าค่าที่รับมาตรงกติกาหรือไม่ ประกาศรุ่นใหม่พูดถึงทั้งการตรวจ การจัดข้อมูลส่งออก และการสร้างคำอธิบายโครงสร้างข้อมูล ตามบล็อกผู้พัฒนา

รุ่นนี้เพิ่มการรองรับ Python 3.15 แปลว่าใช้กับภาษารุ่นใหม่และความสามารถใหม่ส่วนใหญ่ได้ ตามประกาศ Pydantic ต่อมา Python รุ่นใหม่นี้ออกเป็นรุ่นเสถียรวันที่ 9 ตุลาคม แปลว่าพ้นสถานะทดลองแล้ว ตามหน้าเผยแพร่ Python.org แต่สถานะเสถียรของภาษาไม่ได้รับรองว่าแอปของคุณผ่านการทดสอบแล้ว

สิ่งที่เพิ่มมามี frozendict ซึ่งเป็นชนิดข้อมูลเก็บคู่ชื่อกับค่าแบบแก้ไขไม่ได้ และ TypeForm ที่ช่วยเครื่องมือตรวจชนิดข้อมูลเข้าใจรูปแบบชนิดที่ซับซ้อนขึ้น ส่วน MISSING ตัวบอกว่าไม่ได้ส่งค่ามา ได้เปลี่ยนจากฟีเจอร์ทดลองเป็นส่วนหลักของ Pydantic ตามบล็อกสรุปฟีเจอร์

ประโยชน์จึงมีทั้งการรองรับภาษาใหม่และการลดความกำกวมของข้อมูล แต่ผู้พัฒนาย้ำให้อ่านการเปลี่ยนเล็กน้อยก่อนอัปเกรด ตามrelease notes หรือบันทึกประจำรุ่น แล้วถ้าบันทึกบอกว่าไม่ทำลายความเข้ากันได้ ทำไมเรายังต้องทดสอบ?

ทำไมเรื่องนี้เกี่ยวกับคุณ

ถ้าคุณเป็นพนักงานออฟฟิศ ประเด็นที่ควรคุยกับทีมระบบคือแบบฟอร์มที่เคยส่งผ่าน ไม่ใช่ชื่อฟีเจอร์ใหม่ ตัวอย่างที่ยืนยันแล้วคือ NameEmail ชนิดข้อมูลสำหรับชื่อกับอีเมล จะปฏิเสธข้อความที่มีการขึ้นบรรทัดใหม่ ตามGitHub release หากระบบของคุณใช้ชนิดนี้ ควรทดลองข้อมูลที่คัดลอกมาจากเอกสารก่อนใช้งานจริง

สำหรับเจ้าของร้านหรือธุรกิจเล็ก ให้มองเป็นงานตรวจรับการอัปเดต สมมติคุณจ้างทำระบบรับคำสั่งซื้อ ควรถามผู้ดูแลว่าข้อมูลลูกค้าเดิมกับแบบฟอร์มเดิมผ่านหรือไม่ นี่เป็นตัวอย่างงานที่ควรทดสอบ ไม่ใช่รายงานว่าระบบร้านค้าไทยเกิดปัญหาแล้ว

สำหรับนักเรียนหรือคนเรียนเขียนโปรแกรม ต้องแยกการอัปเดตภาษาออกจากการอัปเดตไลบรารี Pydantic เลิกรองรับ Python 3.9 แล้ว ตามเอกสาร changelog หรือประวัติการเปลี่ยนแปลง แปลว่าทำตามบทเรียนเก่าโดยอัปเดตเครื่องมืออย่างเดียว อาจได้ชุดรุ่นที่ผู้พัฒนาไม่ได้รองรับ

คนทั่วไปไม่จำเป็นต้องติดตั้ง Python เพื่อแก้เว็บของบริษัทครับ สิ่งที่ทำได้คือส่งตัวอย่างข้อมูลที่ติดขัดให้ทีมรับผิดชอบ โดยปิดข้อมูลส่วนตัวก่อน ส่วนทีม IT ควรรับผิดชอบการตรวจรุ่นและทดสอบ อย่าให้คนกรอกฟอร์มเป็นคนค้นเองว่าผู้ดูแลเปลี่ยนอะไรไป

ทำงานยังไง

นึกถึงเจ้าหน้าที่รับแบบฟอร์มที่เคาน์เตอร์สำนักงานเขตครับ เจ้าหน้าที่เช็กทีละช่องว่ากรอกครบและตรงรูปแบบ ก่อนรับเอกสารเข้าระบบ Pydantic ทำหน้าที่คล้ายกันกับข้อมูลของโปรแกรม ส่วนกติกาที่ใช้ตรวจถูกกำหนดไว้ใน model หรือแบบกำหนดช่องข้อมูล ตามกลไกและตัวอย่างในประกาศ Pydantic

ในภาพเปรียบเทียบเดียวกัน ช่องที่ไม่ได้กรอกกับช่องที่แจ้งว่าไม่มีค่า ต้องแยกกันให้ได้ MISSING เป็น sentinel หรือค่าพิเศษสำหรับบอกว่าไม่ได้ส่งค่ามาระหว่างตรวจข้อมูล เมื่อ serialization หรือการแปลงข้อมูลเพื่อส่งออกเจอค่านี้ ช่องดังกล่าวจะถูกละออก ตามบล็อก Pydantic เจ้าหน้าที่ไม่ควรเดาใจคนยื่นฟอร์ม แม้จะรับเอกสารมาทั้งวันแล้วก็ตาม

เรื่องนี้ต่างจาก None ซึ่งเป็นค่าที่ระบุว่าไม่มีค่าอย่างชัดเจน ตัวอย่างทางการใช้ MISSING เพื่อเลือกค่าตั้งต้นที่เก็บไว้อีกแห่ง และไม่แสดง MISSING ใน JSON Schema ซึ่งเป็นคำอธิบายว่าข้อมูลต้องมีหน้าตาอย่างไร ตามตัวอย่างในประกาศ ประโยชน์เชิงออกแบบคือแยกคำว่าไม่ได้ส่งออกจากส่งมาเป็นค่าว่าง โดยทีมต้องกำหนดความหมายให้ตรงกับงานของตน

สำหรับ frozendict ผู้พัฒนาระบุว่าตรวจและแปลงส่งออกได้เหมือน dict ปกติ หรือชุดข้อมูลคู่ชื่อกับค่า ตามประกาศ Pydantic ฝั่ง Python.org ก็ระบุว่าภาษาเพิ่มชนิดนี้เป็นความสามารถในตัว ตามหน้าเผยแพร่ Python อย่างไรก็ดี การรองรับชนิดข้อมูลนี้ไม่ได้หมายความว่าต้องเปลี่ยนข้อมูลทุกชุดของแอปให้เป็นแบบแก้ไขไม่ได้

อีกส่วนคือ lazy imports หรือการเลื่อนการโหลดส่วนโปรแกรมไปภายหลัง Pydantic ยกตัวอย่างแบบข้อมูลที่อยู่คนละโมดูล หรือคนละส่วนของโปรแกรม อ้างถึงกันได้โดยไม่ติดปัญหาการโหลดวนกัน ตามบล็อกผู้พัฒนา ส่วน TypeForm ช่วยตัวตรวจชนิดข้อมูลก่อนรัน เข้าใจผลจาก TypeAdapter ซึ่งเป็นเครื่องมือตรวจค่าตามชนิดที่กำหนด ได้ตรงขึ้นตามประกาศเดียวกัน

จุดหักมุม: คำว่าไม่พังไม่ได้ครอบคลุมทุกกรณี

แต่ Pydantic เรียกการเปลี่ยนเล็กน้อยเหล่านี้ว่า non-breaking ตามนโยบายเวอร์ชัน พร้อมเตือนว่าอาจกระทบโค้ดเดิม ตามประกาศรุ่น แปลว่าคำจัดประเภทของผู้พัฒนา กับผลที่เกิดในงานเฉพาะของคุณ เป็นคนละเรื่องที่ต้องตรวจครับ

NameEmail ปฏิเสธการขึ้นบรรทัดใหม่แล้ว ตามGitHub release ถ้าข้อมูลเดิมของคุณมีลักษณะนั้น การทดสอบต้องตอบให้ได้ว่าจะจัดการข้อมูลอย่างไร ข่าวนี้ไม่ได้ยืนยันว่ามีช่องโหว่ จึงไม่ควรตีความการแก้พฤติกรรมเป็นเหตุโจมตีโดยไม่มีหลักฐาน

เรื่องเงิน / ผลกระทบ

แหล่งที่อ่านไม่ได้ให้ตัวเลขค่าอัปเกรด ค่าเสียหาย หรือเวลาที่ธุรกิจไทยจะประหยัดได้ครับ จึงยังคำนวณความคุ้มเป็นเงินบาทไม่ได้ คำแนะนำสำหรับคนคุมงบคือขอรายการงานทดสอบและแผนเปลี่ยนรุ่น ก่อนอนุมัติให้แก้ระบบที่ใช้รับข้อมูลจริง

ด้านความเร็ว บล็อก Pydantic รายงานว่าการปรับปรุงแต่ละรายการส่วนใหญ่ลดเวลาสร้าง model ได้ 5–20% ในชุดวัดของทีม แปลว่าตัวเลขจากผู้พัฒนาเพียงแหล่งนี้วัดงานสร้างแบบข้อมูล ตามรายงานประสิทธิภาพ ไม่ใช่คำรับรองว่าเว็บของคุณจะตอบเร็วขึ้นในสัดส่วนเดียวกัน หรือค่าเครื่องเซิร์ฟเวอร์จะลดตาม

อีกผลกระทบอยู่ที่ JSON Schema ซึ่งเป็นเอกสารกติกาข้อมูลที่โปรแกรมอื่นอาจใช้ต่อ Pydantic เลิกใส่ pattern หรือกฎจับรูปแบบข้อความ ให้ Decimal ซึ่งเป็นชนิดเลขทศนิยม โดยค่าเริ่มต้น ตามบล็อกอธิบายการเปลี่ยน ผู้พัฒนาระบุว่ากฎเดิมทำให้เกิดปัญหา เพราะผู้ใช้บางรายยึด schema ที่สร้างออกมาเป็นข้อตกลงการตรวจข้อมูล

ถ้าทีมของคุณสร้างแบบฟอร์มหรือเอกสารเชื่อมระบบจาก schema ควรเปรียบเทียบผลก่อนกับหลังอัปเดต Pydantic ยังเปลี่ยนให้การสร้าง schema ใช้ค่าตั้งของ TypeAdapter และแสดงข้อจำกัดความยาวข้อความตามค่าตั้งด้วย ตามบล็อกประจำรุ่น คำแนะนำคือทดสอบทั้งการรับข้อมูลและเอกสารกติกาที่ส่งให้ระบบอื่น อย่าตรวจเฉพาะเปิดโปรแกรมแล้วไม่มีข้อความผิดพลาด

ยังมี model_config หรือค่าตั้งของแบบข้อมูล ที่ Pydantic จะไม่แก้เพิ่มเองเหมือนเดิม ตามเอกสาร changelog ทีมที่อ่านค่าตั้งนี้ไปใช้ต่อควรตรวจผลลัพธ์ด้วย ส่วน multiple_of กฎว่าค่าต้องเป็นจำนวนเท่าของค่าที่กำหนด จะต้องใช้ค่าบวก และตรวจพบค่าที่ไม่ถูกต้องตอนกำหนด model ตามบล็อก Pydantic

ข้อมูลที่ยังไม่ชัด และจุดที่แหล่งข่าวพูดไม่ตรงกัน

เสียงสนับสนุนมาจากผู้พัฒนา Pydantic เอง บล็อกของ Victorien Plot ชูการรองรับภาษาใหม่ ฟีเจอร์ใหม่ และการปรับประสิทธิภาพ ตามบทความเปิดตัว ส่วน Python.org ยืนยันสถานะรุ่นเสถียรของภาษา ตามหน้าเผยแพร่ จึงมีหลักฐานสำหรับประโยชน์และความพร้อมระดับโครงการ แต่ยังไม่มีผลทดสอบแอปของผู้อ่าน

เสียงเตือนต่อการอัปเกรดทันทีมาจากทีม Pydantic เช่นกัน ทั้งGitHub release และเอกสาร changelog บอกให้อ่านการเปลี่ยนเล็กน้อยก่อนอัปเกรด นี่เป็นคำเตือนของเจ้าของโครงการ ไม่ใช่คำประกาศคัดค้านรุ่นใหม่จากผู้เชี่ยวชาญอิสระ แหล่งที่ให้มาไม่มีเสียงคัดค้านภายนอก จึงไม่ควรแต่งให้ดูเหมือนมีการถกเถียงแล้ว

จุดที่ดูไม่ตรงกันคือเอกสาร changelog มีข้อความของรุ่นก่อนเผยแพร่รวมอยู่ด้วย ช่วงหนึ่งเขียนว่ายังรองรับความสามารถเฉพาะของภาษาใหม่ไม่ครบ ตามประวัติการเปลี่ยนแปลง แต่บล็อกเปิดตัวระบุว่ารองรับความสามารถใหม่ส่วนใหญ่ ตามประกาศรุ่นจริง ข้อความเหล่านี้อยู่คนละช่วงการพัฒนา จึงไม่ใช่หลักฐานว่ารุ่นจริงถอนการรองรับ

สิ่งที่ยังไม่รู้คือแอปของคุณใช้พฤติกรรมที่เปลี่ยนข้อใด และชุดเครื่องมืออื่นทำงานร่วมกันได้หรือไม่ แหล่งต้นทางไม่ได้ให้รายชื่อระบบไทยที่ผ่านการทดสอบ หรือรับรองเครื่องมือ AI ทุกตัวที่อาจมีไลบรารีนี้อยู่ภายใน ส่วนเวลาประหยัดและต้นทุนย้ายระบบ ต้องวัดจากงานของทีมเอง ไม่ควรนำชุดวัดของผู้พัฒนามาคูณงบประมาณทันที

แล้วเราควรทำอะไร

คนทั่วไป พนักงาน และเจ้าของธุรกิจ: ทำตามได้เลย

  1. ถามผู้ดูแลว่าระบบที่ใช้รับข้อมูลมี Pydantic อยู่หรือไม่ และมีแผนอัปเดตหรือยัง อย่าสรุปว่าเว็บมีปัญหาเพราะข่าวนี้โดยยังไม่ได้ตรวจระบบจริง
  2. เตรียมตัวอย่างงานประจำที่ต้องผ่าน เช่น ส่งแบบฟอร์ม แก้ข้อมูล และเปิดข้อมูลเดิม ให้ทีมทดสอบด้วยข้อมูลจำลองหรือข้อมูลที่ปิดรายละเอียดส่วนตัวแล้ว
  3. ถ้าพบการส่งข้อมูลไม่ผ่าน จดช่องที่กรอก ข้อความผิดพลาด และช่วงที่เกิด แล้วส่งให้ผู้ดูแล ไม่ต้องลองแก้ไลบรารีด้วยตัวเอง

ทีม IT และผู้รับจ้างดูแลระบบ: ทำตามได้เลย

  1. ตรวจรุ่น Python ในระบบใช้งานจริงก่อน หากยังเป็น Python 3.9 แปลว่าต้องตัดสินใจเรื่องฐานภาษาที่หมดการรองรับจาก Pydantic รุ่นใหม่นี้ ตามGitHub release
  2. หากยังย้ายภาษาไม่ได้ ให้กำหนดข้อจำกัด Pydantic <2.14 ไว้ก่อน แปลว่าไม่ปล่อยให้การอัปเดตข้ามเข้าไปรุ่นที่ไม่รองรับ ตามขอบเขตที่ผู้พัฒนาประกาศ นี่เป็นแนวทางชั่วคราว ไม่ใช่คำรับรองเรื่องการดูแลรุ่นเก่าในอนาคต
  3. หากจะย้ายภาษา ให้เลือกชุดรุ่นที่โครงการรองรับและทดสอบแยกจากระบบจริงก่อน บันทึกชุดรุ่นเดิมกับวิธีย้อนกลับ แล้วค่อยกำหนดช่วงนำขึ้นใช้งาน
  4. ตรวจแบบฟอร์มและระบบปลายทางร่วมกับผู้ใช้งาน โดยเฉพาะระบบที่ยึด schema เป็นกติกา เพราะผลสร้าง schema มีการเปลี่ยนตามบล็อก Pydantic

นักพัฒนาและนักเรียนที่ดูแลโค้ด: ทำตามได้เลย

  1. อ่านทั้งบล็อกภาพรวม และรายการเปลี่ยนใน GitHub แล้วทำรายการเฉพาะสิ่งที่โค้ดใช้ อย่าถือว่ารายการฟีเจอร์ใหม่แทนรายการพฤติกรรมที่เปลี่ยนได้
  2. ทดสอบ NameEmail กับการขึ้นบรรทัดใหม่ และเปรียบเทียบ schema ของข้อมูลทศนิยม ตามการเปลี่ยนที่ระบุในGitHub และบล็อก พร้อมตรวจว่าข้อความแจ้งผู้ใช้ยังเข้าใจได้
  3. หากมี wrap serializer หรือฟังก์ชันครอบขั้นตอนแปลงข้อมูลส่งออก ตรวจว่าการเรียก handler ซึ่งเป็นตัวทำขั้นตอนนั้น ส่งอาร์กิวเมนต์ถูกต้อง บล็อกเตือนว่าตัวอย่างเก่าเคยส่ง info ผิดตำแหน่ง และรุ่นใหม่จะรายงานข้อผิดพลาดชัดเจน ตามคำอธิบายผู้พัฒนา
  4. ถ้าจะนำ MISSING มาใช้ กำหนดความหมายของไม่ได้ส่งค่ากับค่าว่างให้ชัด แล้วทดสอบข้อมูลส่งออก ส่วน frozendict และ TypeForm ให้เริ่มจากส่วนที่ได้ประโยชน์จริง ตามขอบเขตฟีเจอร์ในประกาศ

ผมมองว่า…

ผมมองว่า ข่าวนี้ไม่ใช่การแข่งขันว่าใครใช้รุ่นใหม่ก่อน แต่คือการรักษากติกาข้อมูลให้ตรงกับงานจริง คนดูแลระบบควรอธิบายได้ว่าอัปเดตแล้วช่องไหนเปลี่ยน และผู้ใช้จะเจออะไร การทดสอบที่มีตัวอย่างงานประจำช่วยให้คนคุมงบตัดสินใจจากหลักฐาน แทนการตัดสินใจจากคำว่าใหม่หรือเสถียรเพียงอย่างเดียว

ผมมองว่า MISSING น่าสนใจในฐานะเครื่องมือช่วยแยกความหมาย แต่ประโยชน์จะเกิดเมื่อทีมตกลงกันว่าการไม่ส่งค่าหมายถึงอะไร คำประกาศว่าฟีเจอร์เสถียรแล้วเป็นข้อมูลจากPydantic ส่วนการเลือกใช้กับแบบฟอร์มหรืองานของคุณ เป็นการออกแบบที่ยังต้องตรวจผลเองครับ

ปิดท้าย: สิ่งที่ต้องจับตา

ความพร้อมของซอฟต์แวร์สำหรับงานประจำ วัดได้จากข้อมูลที่ยังรับและส่งได้ถูกต้องหลังอัปเดต ให้จับตาผลทดสอบชุดรุ่นของทีม หลัง Pydantic เปิดตัววันที่ 8 ตุลาคม ตามประกาศ อีกเรื่องคือคำชี้แจงหรือการแก้ไขที่ตามมาในเอกสาร changelog ซึ่งแหล่งที่อ่านยังไม่ได้กำหนดวันรุ่นถัดไป

ถ้าทีมคุณต้องเลือกแบบฟอร์มงานประจำเพียงอย่างเดียวมาทดสอบก่อนอัปเดต คุณจะเลือกแบบฟอร์มไหน และเพราะอะไร?

Recap

  • เกิดอะไรขึ้น: Pydantic เพิ่มการรองรับภาษาใหม่ พร้อม frozendict, TypeForm และ MISSING ที่เสถียร ตามประกาศรุ่น
  • เลขที่ต้องจำ: Python 3.9 แปลว่าฐานภาษาที่ Pydantic รุ่นนี้เลิกรองรับแล้ว ตามGitHub
  • ใครเห็นต่าง: ไม่มีเสียงค้านอิสระในแหล่งที่อ่าน แต่ทีม Pydantic ชูประโยชน์พร้อมเตือนให้อ่านการเปลี่ยนก่อนอัปเกรด ตามบล็อก
  • ยังไม่รู้: แอปของคุณผ่านหรือไม่ ต้นทุนย้ายเท่าไร และรุ่นถัดไปออกเมื่อใด ต้องรอหลักฐานเพิ่มเติม
  • กระทบคุณ: ให้ทีมตรวจข้อมูลเดิม แบบฟอร์ม และ schema ก่อนเปลี่ยนระบบที่ใช้งานจริง
  • จับตา: ผลทดสอบของทีมและรายการแก้ไขต่อในประวัติรุ่น
  • แหล่งอ้างอิง: 1 — Pydantic Blog, 2 — GitHub release, 3 — Pydantic Docs, 4 — Python.org