อัปเดต
Python
Python 3.15 เริ่มต้นยุค farewell กับ re.match() ฟังก์ชันที่หลอกคนมาตลอด
ชื่อใหม่ re.prefixmatch() บอกตรงๆ ว่ามันแมตช์แค่ต้นสตริง ไม่ใช่ทั้งสตริงอย่างที่ใครหลายคนเข้าใจผิด
ทีมข่าว เอไอไทย.com
⏱ อ่าน 3 นาที
บางทีปัญหาที่ใหญ่ที่สุดของฟังก์ชันหนึ่งอาจไม่ใช่บั๊ก แต่เป็นชื่อของมันเองนี่แหละ
ถ้าใครเคยเขียน Python แล้วงงกับ re.match() ว่า "ทำไมแมตช์ไม่เจอทั้งที่ข้อความมันมีอยู่นะ" — ข่าวนี้คือคำตอบว่าคุณไม่ได้โง่คนเดียว และทีมพัฒนาภาษา Python ก็รู้เรื่องนี้ดี
Python มีแนวคิดที่เรียกว่า "soft deprecation" ครับ คือการติดป้าย API ว่าต่อไปนี้ "ไม่ควรใช้เขียนโค้ดใหม่แล้ว" แต่ก็ไม่ได้สัญญาหรือขู่ว่าจะลบมันออกไปในอนาคต — เป็นการบอกใบ้แบบนุ่มนวล ไม่ได้ตัดหางปล่อยวัด
และเป้าหมายล่าสุดที่ถูกจับเข้าโครงการนี้ก็คือ re.match() ฟังก์ชันคลาสสิกที่อยู่คู่ Python มานาน แต่ก็สร้างความสับสนให้คนเขียนโค้ดมานานพอกัน
Hugo van Kemenade ผู้ดูแลการปล่อยเวอร์ชัน Python 3.15 อธิบายว่าเวอร์ชันที่กำลังจะมาถึงนี้จะเริ่ม soft deprecation ให้ re.match() พร้อมกับเปิดตัวชื่อใหม่ที่ชัดเจนกว่าอย่าง re.prefixmatch()
ชื่อใหม่นี้สื่อความหมายตรงตัวเลยครับ — มันแมตช์แพตเทิร์นที่จุดเริ่มต้นของสตริง แต่ไม่ได้ผูกกับจุดสิ้นสุด นั่นคือหัวใจของความสับสนทั้งหมดที่ผ่านมา หลายคนเข้าใจผิดว่า re.match() แมตช์ทั้งสตริง ซึ่งจริงๆ แล้วไม่ใช่
ปัญหาคือชื่อ "match" เฉยๆ มันกำกวมเกินไป มันไม่ได้บอกอะไรเลยว่าจุดจบของสตริงมีผลด้วยหรือเปล่า คนที่เพิ่งหัดเขียน regex ใน Python จึงมักเจอบั๊กเงียบๆ แบบนี้บ่อยครั้ง
Simon Willison เจ้าของบล็อกต้นทางข่าวนี้ย้ำชัดว่า ในกรณีส่วนใหญ่คนเขียนโค้ดมักต้องการฟังก์ชันอื่นมากกว่า และเขาแจกแจงให้เห็นภาพแบบนี้
re.search()
ใช้เมื่ออยากแมตช์แพตเทิร์นที่ตำแหน่งไหนก็ได้ในสตริง
re.fullmatch()
ใช้เมื่อต้องการให้แพตเทิร์นต้องตรงกับทั้งสตริงตั้งแต่ต้นจนจบ
re.prefixmatch()
ชื่อใหม่แทน re.match() สำหรับกรณีที่ต้องการแมตช์เฉพาะต้นสตริงจริงๆ
จะเห็นว่าการแยกชื่อให้ตรงกับพฤติกรรมจริงแบบนี้ช่วยลด cognitive load ของคนอ่านโค้ดได้เยอะมาก โค้ดที่เขียนด้วย re.search() กับ re.fullmatch() จะสื่อเจตนาของคนเขียนได้ชัดตั้งแต่อ่านชื่อฟังก์ชัน ไม่ต้องไปเปิด docs เช็คพฤติกรรมทีหลัง
ส่วน re.match() เองก็ยังใช้ได้อยู่ ไม่ได้หายไปไหน แค่ถูกติดป้ายว่า "ไม่ควรใช้กับโค้ดใหม่" เท่านั้น ซึ่งก็เป็นวิธีจัดการที่ฉลาดกว่าการลบออกทันที เพราะโค้ดเก่าในระบบ production ทั่วโลกยังเรียกใช้มันอยู่เพียบ การลบตรงๆ คงเกิดเสียงด่าทั่วโลกแน่นอน
นี่คือตัวอย่างชั้นดีที่แสดงว่าชื่อฟังก์ชันที่ไม่ชัดเจนมันสร้างหนี้ทางเทคนิคได้จริง การตั้งชื่อให้ตรงกับพฤติกรรมตั้งแต่แรกคือการลงทุนที่ถูกที่สุด และ re.prefixmatch() ก็มาชดเชยความสับสนที่ re.match() สร้างไว้หลายสิบปี
ที่มา: Simon Willison's Weblog — อ่านต้นฉบับ
ความคิดเห็น 6
กำลังโหลดความคิดเห็น...