Python อาจได้รับรูปแบบการจับคู่ไวยากรณ์

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

การจับคู่รูปแบบเป็นคุณสมบัติทั่วไปของภาษาโปรแกรมหลายภาษาเช่นswitch/caseในภาษา C ซึ่งอนุญาตให้ดำเนินการตามค่าของตัวแปรหรือนิพจน์ที่กำหนด แม้ว่า Python จะไม่มีไวยากรณ์ดั้งเดิมสำหรับการจับคู่รูปแบบ แต่ก็เป็นไปได้ที่จะเลียนแบบด้วย  if/elif/elseเครือข่ายหรือการค้นหาพจนานุกรม

PEP 622 เสนอวิธีการจับคู่นิพจน์กับรูปแบบต่างๆโดยใช้match/caseไวยากรณ์:

ตรงกับบางอย่าง: case 0 | 1 | 2: พิมพ์ ("ตัวเลขเล็ก") กรณี [] | [_]: print ("ลำดับสั้น ๆ ") case str () | bytes (): print ("Something string-like") case _: print ("อย่างอื่น")

ประเภทการจับคู่รูปแบบที่รองรับ ได้แก่ ลิเทอรัลชื่อค่าคงที่ลำดับการแมป (โดยทั่วไปการมีคู่คีย์ - ค่าในนิพจน์) คลาสส่วนผสมของสิ่งที่กล่าวมาข้างต้นหรือนิพจน์เงื่อนไขใด ๆ การจับคู่ใด ๆ ที่ไม่ชัดเจนหรือไม่สามารถแก้ไขได้จะทำให้เกิดข้อยกเว้นที่รันไทม์

ออบเจ็กต์สามารถจัดการการทดสอบการจับคู่โดยใช้โปรโตคอลใหม่ที่เรียกว่า__match__โปรโตคอล หากออบเจ็กต์ใช้__match__เมธอดสามารถใช้เพื่อทดสอบว่าตรงกับรูปแบบคลาสที่กำหนดหรือไม่และส่งคืนการตอบสนองที่เหมาะสม

PEP 622 ยังอนุญาตให้ตัวตรวจสอบประเภทคงที่เพื่อตรวจสอบว่าสามารถตรวจสอบการจับคู่ได้ @sealedมัณฑนากรใหม่สำหรับคลาสระบุให้พิมพ์ตัวตรวจสอบว่าคลาสย่อยใด ๆ ของคลาสที่เป็นปัญหาถูกกำหนดไว้ในโมดูลเดียวกับคลาสพื้นฐาน

PEP ก่อนหน้านี้ที่จะเพิ่มการจับคู่รูปแบบ - PEP 275 และ PEP 3103 ซึ่งเสนอในปี 2544 และ 2549 ตามลำดับถูกปฏิเสธเนื่องจากขาดการสนับสนุนที่เป็นที่นิยม PEP 3103 ร่างโดย Guido van Rossum ผู้สร้าง Python PEP ใหม่ซึ่งประพันธ์โดย van Rossum และอื่น ๆ อีกมากมายมีจุดมุ่งหมายเพื่อจัดเตรียมนิพจน์ทั่วไปสำหรับการจับคู่อ็อบเจ็กต์แทนที่จะเป็นเพียงการif/elif/else แทนที่แบบธรรมดา ผู้เขียนทราบว่า PEP นี้หลายแง่มุมได้รับแรงบันดาลใจจากการจับคู่รูปแบบใน Rust และ Scala 

วิธีการทั้งหมดนี้จะถูกนำไปใช้ภายใต้ประทุนยังคงเป็นเรื่องสำหรับการอภิปราย การใช้งานที่เสนอใน PEP 622 จะสร้างลำดับ bytecode เดียวกันเป็นif/elif/elseลูกโซ่ switch/caseบล็อกที่ใหญ่ขึ้นอาจมีประสิทธิภาพน้อยลงขึ้นอยู่กับว่าตรรกะเงื่อนไขรวมอยู่ในแต่ละส่วนcaseมากน้อยเพียงใด แต่ PEP ทำให้ชัดเจนว่ามีวิธีการและการเพิ่มประสิทธิภาพการทำงานจำนวนมาก (เช่นการบันทึกช่วยจำ) ยังคงอยู่บนโต๊ะ

แม้ว่า PEP จะได้รับการยอมรับ แต่เรื่องนี้ก็อาจเปลี่ยนแปลงไปได้มาก ประเด็นหนึ่งที่น่าจะถูกท้าทายคือการใช้case _: แทนelse: ประโยคสุดท้ายสำหรับ  switch คำสั่ง _ ถูกใช้เป็นตัวแปรชั่วคราวในหลาย ๆ บริบทและการลบล้างพฤติกรรมของมันเพียงฝ่ายเดียวอาจเป็นการปิดกั้นสำหรับนักพัฒนา