Switch-Case ทิพย์บน Python 3.10 ในที่สุด ก็มีสักที

เวลาเราสอน Python หลาย ๆ คนที่เคยเขียนโปรแกรมภาษาอื่น ๆ อย่างพวก C มาก่อนแล้ว ก็จะถามว่า พี่ แล้ว Python ไม่มี Switch Case เหมือนใน C เหรอ ใช่แล้ว มันไม่มีแหละ ก็ต้อง if ไป แต่วันนี้ Python 3.10 ออก Release เต็มแล้ว และมี Feature ใหม่ที่ถามหากันทั่วคือ Switch Case หรือที่ฝั่ง Python เองเรียกว่า Pattern Matching เรามาลองใช้งานกันขำ ๆ

ปล. การจะใช้งาน Pattern Matching เราจะต้องใช้ Python 3.10 หรือสูงกว่านะ ถ้าใช้ Conda ก็สร้าง Environment ใหม่ไว้ลองได้เลย

Pattern Matching

selected_option = input('Please input the option')

match selected_option:
    case 1:
    	print('Order has selected')
    case 2:
    	print('Admin mode has selected')
    case _:
    	print('Bye')

Syntax ของมันทำมาในรูปแบบตัวอย่างด้านบนคือ จะเริ่มด้วยคำว่า match ก่อน แล้วตามด้วยตัวแปรที่เราต้องการจะตรวจสอบ จากนั้น ใน Block จะเป็นแต่ละเคสแล้วว่ามันจะเป็นอะไร เช่น case 1 ก็คือถ้า selected_option เป็น 1 มันก็จะทำงานใน Sub-Block ของ Case 1 เลยทันทีเป็นแบบนี้ไปเรื่อย ๆ จน Case สุดท้ายที่เราใส่ Underscore เอาไว้ คือ ถ้ามันไม่เข้า Case ไหนเลย ก็ให้มันทำงาน Case นี้ไปแค่นั้น อันนี้มันเป็นแค่น้ำจิ้มเท่านั้น ลองไปดูเคสที่อร่อยกว่านี้ดีกว่า

prediction_result_container = [[2,1,0], [1,7], [6]]

for prediction_result in prediction_result_container :
    switch prediction_result :
        case [x] :
            print(f"Result contains single element is {x}")
        case [x,y] :
            print(f"Result contains 2 elements are {x} and {y}")
        case [x,10] :
            print(f"Result contains 2 element but one of them is not exists ({x})")
        case [x,y,z] :
            print(f"Result contains 3 elements are {x}, {y} and {z}")
        
Result contains 3 elements are 2, 1 and 0
Result contains 2 elements are 1 and 7
Result contains single element is 6

เราทำให้ Advance ขึ้น เรายกตัวอย่างว่า ตอนที่เราทำ Model Inference ออกมาแล้ว เราอาจจะ Filter ค่าความมั่นใจออกมาว่าถ้าเกิน 80% ให้ดึงออกมา ไม่สนว่ามีกี่ตัว ทำให้เราได้ ตัวแปร prediction_result_container เข้ามา จากนั้น เราก็อาจจะอยากให้โปรแกรมมันแสดงว่า มันได้กี่ Element ที่น่าจะใช่ และ มีอะไรบ้างออกมา

หรือใน Case ที่ 3 จากด้านบน เราจะเห็นว่า เรา Matching ด้วยกฏที่เพิ่มเข้าไปอีกว่าถ้ามันเป็น List ที่มี 2 Elements อยู่ด้านใน และตัวสุดท้ายเป็น 10 ให้มันทำใน Block ได้ ทำให้ใน Pattern Matching มันทำได้ตามชื่อจริง ๆ คือ เราสามารถบอกมันได้ด้วยว่า Pattern มันจะหน้าตาเป็นอย่างไร เช่นในตัวอย่างด้านบน เราเช็คเลยว่า มันเป็น List ที่มีกี่ Element และให้มัน Assign เก็บไว้ในตัวแปรเลย เพื่อให้เราสามารถเข้าถึงภายในแต่ละ Case ได้เลย

สรุป

Pattern Matching ไม่ได้ทำให้เราทำอะไรใหม่ได้มากหรอก แต่มันทำให้การเขียน Code มันสะอาดมากขึ้นจากเดิมที่เราใช้ If-Condition แล้วมันยาว ๆ ไม่สวยเท่าไหร่พอมี Pattern Matching มา มันก็ทำให้เราเขียนออกมาได้ดูดี อ่านง่ายกว่าเดิมเยอะ ถือว่าเป็น ของเล่นใหม่ เป็น Switch-Case on Steroid มาก ๆ ใน Python 3.10 ที่เรา Hype กับมันมาก ๆ ตัวนึงเลยทีเดียว