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

python decorator

Decorator เป็นการเขียน function ครอบ function เพื่อให้สามารถ แยก logic บางอย่าง เช่น validate, connection ต่าง ๆ ออกจาก business ได้

รูปแบบ ก็จะเป็นแบบนี้
function( function( function (data) ) )

function( function( function (data), condition ), condition )
และก็ไม่จำเป็นเสมอไปที่ function ข้างนอกสุดจะทำก่อน มันขึ้นอยู่ตอน เราเขียน decorator
ว่าจะให้ทำอะไรก่อนครับ ตามตัวอย่างได้ อธิบายไว้ ด้านล่าง.

---------------------------------

##Example Decorator class :

## สร้างเพื่อไว้ validate field ที่ต้องการ check ว่าต้องมีส่งมา
## ถ้าไม่มีจะ raise (แจ้ง error) กลับไป ยัง function ที่ทำการเรียก
## และเมื่อ check ว่ามีครบ ก็จะทำการเรียก function ต่อไป
class ReqParam:
    def __init__(self, *args):
        self.fields = args
    def __call__(self, f):
        fileds = self.fields
        def wrapper_func(*arg, **kws):
            dict = kws
            for filed in fields:
                if not kw.has_key(filed) or '' == kw.get(filed):
                    raise Exception('parameter '+filed+' not set.')
            dict = f(*arg, **kws)
            return dict
        return wrapper_func
## จุดสำคัญคือ การว่าในส่วนของ dict = f(*arg, **kws) จะเป็นจุดกำหนดว่าจะทำ function ก่อน
## หรือ Decorator นั้นจะจัดการอะไรบางอย่างก่อนครับ

---------------------------------

##Example function use Decorator :

## ตัวอย่างการเรียกใช้ ในที่นี้เราจะเห็นได้ว่า สามารถมี Decorator ได้มากกว่า 1
    @ReqParam('refno', 'frommsn', 'tomsn', 'msg', 'msgseq')
    def postwap(self, **kw):
        refno = kw.get('refno')
        frommsn = kw.get('frommsn')
        tomsn = kw.get('tomsn')
        msg = kw.get('msg')
        msgindex = kw.get('msgseq')
        print 'refno:', refno, 'from msn:', frommsn, ', to msn:', tomsn, ', message:', msg, ', msgseq:', msgseq
        kw.setdefault('status', 0)
        return kw
## สำหรับการเรียกใช้ function ก็เป็นการเรียก ตามปกติครับ

ไปต่อกันดีกว่าครับที่ decorator ซ้อนหลายชั้น
python multi decorator

---------------------------------

ในส่วนของการ เขียน Decorator นั้น สามารถทำได้ทั้ง แบบ def หรือ class ก็ได้ครับ
ตัวอย่าง :
http://www.python.org/dev/peps/pep-0318/
http://www.artima.com/weblogs/viewpost.jsp?thread=240808

End...

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