วิธีการเรียกฟังก์ชันตามชื่อโดยใช้สตริงใน Python
ในการเขียนโปรแกรม Python มีบางครั้งที่คุณต้องการเรียกฟังก์ชันตามชื่อที่ถูกเก็บในตัวแปรสตริง สิ่งนี้มีประโยชน์โดยเฉพาะในกรณีที่คุณมีชุดฟังก์ชันและคุณต้องการเรียกใช้ฟังก์ชันเหล่านั้นอย่างไดนามิกตามการป้อนข้อมูลของผู้ใช้หรือเงื่อนไขอื่น ๆ
ในบล็อกโพสต์นี้เราจะสำรวจ วิธีเรียกฟังก์ชันโดยใช้สตริงที่มีชื่อของฟังก์ชัน โดยให้วิธีการที่ชัดเจนและมีระเบียบในการทำเช่นนี้
ปัญหา: การเรียกฟังก์ชันอย่างไดนามิก
ลองจินตนาการว่าคุณมีโมดูลชื่อ foo
ซึ่งรวมถึงฟังก์ชันที่เรียกว่า bar
คุณต้องการเรียกใช้ฟังก์ชันนี้ แต่แทนที่จะเรียกมันโดยตรง คุณมีเพียงชื่อของฟังก์ชันในรูปแบบสตริง:
import foo
func_name = "bar"
call(foo, func_name) # เราจะทำให้มันทำงานได้อย่างไร?
คุณอาจจะสงสัยว่าจะมีวิธีใดในการแปลงสตริงนี้ให้เป็นการเรียกใช้งานฟังก์ชันได้ วิธีแก้ไขอยู่ที่ฟังก์ชันในตัวของ Python ที่เรียกว่า getattr
วิธีแก้ไข: การใช้ getattr
getattr
คืออะไร?
getattr
เป็นฟังก์ชันในตัวใน Python ที่อนุญาตให้คุณเรียกคืนแอตทริบิวต์ (ในกรณีนี้คือฟังก์ชัน) จากอ็อบเจ็กต์ (โมดูล คลาส หรืออินสแตนซ์) อย่างไดนามิก ซึ่งหมายความว่าคุณสามารถระบุชื่อของแอตทริบิวต์ในรูปแบบสตริงและได้รับอ็อบเจ็กต์ที่แท้จริงที่เกี่ยวข้องกับชื่อนั้นกลับมา
วิธีการใช้ getattr
เพื่อเรียกใช้ฟังก์ชัน
นี่คือวิธีการใช้ getattr
เพื่อเรียกฟังก์ชันที่เก็บไว้ในสตริง:
-
นำเข้าโมดูล: ก่อนอื่นให้แน่ใจว่าคุณได้นำเข้าโมดูลที่มีฟังก์ชันที่คุณต้องการเรียกใช้
import foo
-
เรียกคืนฟังก์ชัน: ใช้
getattr
เพื่อรับฟังก์ชันจากโมดูลโดยใช้ชื่อของมันในรูปแบบสตริงbar = getattr(foo, 'bar')
-
เรียกใช้ฟังก์ชัน: ตอนนี้ที่คุณมีการอ้างอิงฟังก์ชันนี้แล้ว คุณสามารถเรียกใช้มันได้เหมือนฟังก์ชันทั่วไป
result = bar() # นี่จะเรียกใช้ foo.bar()
ตัวอย่างโค้ด
นี่คือโค้ดที่ทำงานได้ทั้งหมด:
import foo
# ชื่อฟังก์ชันในรูปแบบสตริง
func_name = "bar"
# เรียกคืนฟังก์ชันโดยใช้ getattr
bar = getattr(foo, func_name)
# เรียกใช้ฟังก์ชัน
result = bar() # นี่จะเรียกใช้ foo.bar()
ข้อควรจำ
-
getattr
สามารถใช้ได้ไม่เพียงแค่สำหรับฟังก์ชันระดับโมดูลแต่ยังสำหรับเมธอดของคลาสและอื่น ๆ -
หากแอตทริบิวต์ (ฟังก์ชัน) ไม่มีอยู่
getattr
จะเกิดข้อผิดพลาดAttributeError
คุณสามารถระบุค่าเริ่มต้นเพื่อหลีกเลี่ยงสิ่งนี้โดยใช้พารามิเตอร์ที่สองในgetattr
bar = getattr(foo, 'bar', None) # หาก 'bar' ไม่มีอยู่ จะคืนค่า None
แหล่งข้อมูลเพิ่มเติม
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ getattr
คุณสามารถตรวจสอบเอกสาร Python อย่างเป็นทางการ ที่นี่.
สรุป
การเรียกฟังก์ชันแบบไดนามิกโดยใช้การแทนค่าสตริงของชื่อฟังก์ชันสามารถเพิ่มความยืดหยุ่นให้กับโค้ดของคุณได้อย่างมาก ด้วยความช่วยเหลือจาก getattr
คุณสามารถจัดการและเรียกใช้ฟังก์ชันตามชื่อตัวแปรได้ง่ายขึ้น ทำให้โปรแกรมของคุณมีความสามารถและเป็นมิตรกับผู้ใช้มากขึ้น
อย่าลังเลที่จะลองใช้วิธีนี้กับฟังก์ชันและโมดูลของคุณเอง และใช้ประโยชน์จากความสามารถอันทรงพลังนี้ใน Python!