Guido van Rossum เสนอให้เพิ่มตัวดำเนินการจับคู่รูปแบบให้กับ Python

กุยโด ฟาน รอสซุม ส่ง ร่างเพื่อทบทวนชุมชน ข้อกำหนด สำหรับการนำตัวดำเนินการจับคู่รูปแบบไปใช้ (การจับคู่และตัวพิมพ์) ใน Python ควรสังเกตว่าข้อเสนอในการเพิ่มตัวดำเนินการจับคู่รูปแบบนั้นได้รับการเผยแพร่แล้วในปี 2001 และ 2006 (เป๊ป-0275, เป๊ป-3103) แต่ถูกปฏิเสธเนื่องจากการปรับโครงสร้าง "ถ้า ... elif ... อื่น" ให้เหมาะสมเพื่อรวบรวมเชนที่ตรงกัน

การใช้งานใหม่นั้นเหมือนกับตัวดำเนินการ "match" ที่มีอยู่ใน Scala, Rust และ F# ซึ่งเปรียบเทียบผลลัพธ์ของนิพจน์ที่ระบุกับรายการรูปแบบที่แสดงอยู่ในบล็อกตามตัวดำเนินการ "case" ต่างจากตัวดำเนินการ "switch" ที่มีอยู่ใน C, Java และ JavaScript นิพจน์ที่ใช้ "match" ให้ประโยชน์มากกว่ามาก ฟังก์ชั่นที่กว้างขวาง. มีข้อสังเกตว่าตัวดำเนินการที่เสนอจะปรับปรุงความสามารถในการอ่านโค้ด ลดความซับซ้อนของการเปรียบเทียบวัตถุ Python และการดีบักโดยพลการ และยังเพิ่มความน่าเชื่อถือของโค้ดเนื่องจากความเป็นไปได้ในการขยาย การตรวจสอบประเภทคงที่.

def http_error (สถานะ):
สถานะการแข่งขัน:
กรณีที่ 400:
ส่งคืน "คำขอไม่ถูกต้อง"
กรณี 401|403|404:
กลับ "ไม่ได้รับอนุญาต"
กรณีที่ 418:
กลับ "ฉันเป็นกาน้ำชา"
กรณี_:
กลับ "อย่างอื่น"

ตัวอย่างเช่น คุณสามารถแยกอ็อบเจ็กต์ สิ่งทูเพิล รายการ และลำดับที่ต้องการเพื่อผูกตัวแปรตามค่าที่มีอยู่ได้ อนุญาตให้กำหนดเทมเพลตที่ซ้อนกัน ใช้เงื่อนไข “if” เพิ่มเติมในเทมเพลต ใช้มาสก์ (“[x, y, *rest]”) การแมปคีย์/ค่า (เช่น {“bandwidth”: b, “latency ”: l} เพื่อแยกค่า "แบนด์วิธ" และ "เวลาแฝง" และพจนานุกรม) แยกเทมเพลตย่อย (": =" โอเปอเรเตอร์) ใช้ค่าคงที่ที่มีชื่อในเทมเพลต ในคลาส คุณสามารถปรับแต่งพฤติกรรมการจับคู่ได้โดยใช้เมธอด “__match__()”

จากคลาสข้อมูลนำเข้าคลาสข้อมูล

@ดาต้าคลาส
คะแนนชั้นเรียน:
x:int
ย:int

def ที่ไหน (จุด):
จุดแข่งขัน:
กรณีจุด (0, 0):
พิมพ์("ต้นกำเนิด")
กรณีจุด (0, y):
print(f»Y={y}»)
กรณีจุด (x, 0):
พิมพ์(f"X={x}")
กรณีจุด ():
print("ที่อื่น")
กรณี_:
print("ไม่ใช่จุด")

จุดแข่งขัน:
กรณี จุด(x, y) ถ้า x == y:
พิมพ์ (f "Y = X ที่ {x}")
กรณีจุด(x, y):
print(f"ไม่อยู่ในแนวทแยง")

แดง, เขียว, น้ำเงิน = 0, 1, 2
จับคู่สี:
กรณี .RED:
print("ฉันเห็นสีแดง!")
กรณี. สีเขียว:
print("หญ้าเป็นสีเขียว")
กรณี .BLU
E:
print(“ฉันรู้สึกเศร้า :(“)

มีการเตรียมชุดเพื่อตรวจสอบ แพทช์ ด้วยการทดลอง การนำไปใช้ สเปคที่เสนอมาแต่เวอร์ชั่นสุดท้ายยังคงอยู่ กล่าวถึง. ตัวอย่างเช่น ที่นำเสนอ แทนที่จะใช้นิพจน์ "case _:" สำหรับค่าเริ่มต้น ให้ใช้คีย์เวิร์ด "else:" หรือ "default:" เนื่องจาก "_" ในบริบทอื่นถูกใช้เป็นตัวแปรชั่วคราว ที่น่าสงสัยก็คือองค์กรภายในซึ่งมีพื้นฐานมาจากการแปลนิพจน์ใหม่เป็นโค้ดไบต์คล้ายกับที่ใช้สำหรับโครงสร้าง "ถ้า ... elif ... อื่น" ซึ่งจะไม่ให้ประสิทธิภาพที่ต้องการเมื่อประมวลผลชุดการเปรียบเทียบที่มีขนาดใหญ่มาก

ที่มา: opennet.ru

เพิ่มความคิดเห็น