วันพฤหัสบดีที่ 28 พฤษภาคม พ.ศ. 2552

Python direct function by string

สักวันหนึ่งเราคงได้พบว่า การเขียน if else เพื่อเลือกเรียก function นั้น เป็นเรื่องรกและสิ้นเปลืองพลังงาน แถมยังทำให้ code ไม่สวยงาม
ในส่วนของ post ชุดนี้จึงนำเสนอวิธีการเรียก function ด้วย string มาแต่จำเป็นที่ string นั้น จะต้องเป็นชื่อเดียวกับ function นะครับ โดยตัวอย่างนี้มีอยู่สองวิธีครับ ตามด้านล่างเลย

สมมุติ code มีอยู่ว่า

class Test(object):
    def __init__(self):
        pass
    def a(self, data):
        print '--a-- %s' %str(data)

    def b(self, data):
        print '--b-- %s' %str(data)

    def c(self, data):
        print '--c-- %s' %str(data)

    def call(self, fname, data):
        if 'a' == fname:
            self.a(data)
        elif 'b' == fname:
            self.b(data)
        else:
            self.c(data)

1. การใช้ eval() << เหมาะกับการใช้เรียกแบบตรง ๆ ซึ่งไม่จำเป็นว่า function ที่เรียกต้องอยู่ใน Object

def call(fname, data):
try:
eval('self.%s(data)' %fname)
except:
self.c(data) #default call function c

2. การใช้ getattr() << สะดวกมาก แต่ใช้ได้แต่กับ object เพราะต้องอ้าง attribute

def call(fname, data):
getattr(self, fname, 'c')(data)

และในกรณีใด ๆ ที่เราต้องการอ้างถึง object ตัวอื่น ก็สามารถแทนที่ของ self ครับ ไม่จำเป็นว่าต้องเรียกตัวเองเสมอไป

ค่อยข้างจะมีประโยชน์คนละแบบครับ แล้วแต่การใช้งาน

ไม่มีความคิดเห็น: