วิธีการเรียกฟังก์ชันตามชื่อโดยใช้สตริงใน Python

ในการเขียนโปรแกรม Python มีบางครั้งที่คุณต้องการเรียกฟังก์ชันตามชื่อที่ถูกเก็บในตัวแปรสตริง สิ่งนี้มีประโยชน์โดยเฉพาะในกรณีที่คุณมีชุดฟังก์ชันและคุณต้องการเรียกใช้ฟังก์ชันเหล่านั้นอย่างไดนามิกตามการป้อนข้อมูลของผู้ใช้หรือเงื่อนไขอื่น ๆ

ในบล็อกโพสต์นี้เราจะสำรวจ วิธีเรียกฟังก์ชันโดยใช้สตริงที่มีชื่อของฟังก์ชัน โดยให้วิธีการที่ชัดเจนและมีระเบียบในการทำเช่นนี้

ปัญหา: การเรียกฟังก์ชันอย่างไดนามิก

ลองจินตนาการว่าคุณมีโมดูลชื่อ foo ซึ่งรวมถึงฟังก์ชันที่เรียกว่า bar คุณต้องการเรียกใช้ฟังก์ชันนี้ แต่แทนที่จะเรียกมันโดยตรง คุณมีเพียงชื่อของฟังก์ชันในรูปแบบสตริง:

import foo
func_name = "bar"
call(foo, func_name)  # เราจะทำให้มันทำงานได้อย่างไร?

คุณอาจจะสงสัยว่าจะมีวิธีใดในการแปลงสตริงนี้ให้เป็นการเรียกใช้งานฟังก์ชันได้ วิธีแก้ไขอยู่ที่ฟังก์ชันในตัวของ Python ที่เรียกว่า getattr

วิธีแก้ไข: การใช้ getattr

getattr คืออะไร?

getattr เป็นฟังก์ชันในตัวใน Python ที่อนุญาตให้คุณเรียกคืนแอตทริบิวต์ (ในกรณีนี้คือฟังก์ชัน) จากอ็อบเจ็กต์ (โมดูล คลาส หรืออินสแตนซ์) อย่างไดนามิก ซึ่งหมายความว่าคุณสามารถระบุชื่อของแอตทริบิวต์ในรูปแบบสตริงและได้รับอ็อบเจ็กต์ที่แท้จริงที่เกี่ยวข้องกับชื่อนั้นกลับมา

วิธีการใช้ getattr เพื่อเรียกใช้ฟังก์ชัน

นี่คือวิธีการใช้ getattr เพื่อเรียกฟังก์ชันที่เก็บไว้ในสตริง:

  1. นำเข้าโมดูล: ก่อนอื่นให้แน่ใจว่าคุณได้นำเข้าโมดูลที่มีฟังก์ชันที่คุณต้องการเรียกใช้

    import foo
    
  2. เรียกคืนฟังก์ชัน: ใช้ getattr เพื่อรับฟังก์ชันจากโมดูลโดยใช้ชื่อของมันในรูปแบบสตริง

    bar = getattr(foo, 'bar')
    
  3. เรียกใช้ฟังก์ชัน: ตอนนี้ที่คุณมีการอ้างอิงฟังก์ชันนี้แล้ว คุณสามารถเรียกใช้มันได้เหมือนฟังก์ชันทั่วไป

    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!