最近繼續給Ubuntu Tweak不斷的添磚加瓦,目标将于下個月末與Ubuntu 12.04一齊釋出一個新版本——Ubuntu Tweak 0.7。
在這個過程中,有了不少心得,也确實好久沒有寫具體的技術文章,今天就來寫一篇吧~
今天要介紹的是Python的decorator的應用,我不打算介紹什麼是decorator。因為學習一樣技術不難,難的是如何把它應用起來。昨天我
在說我在用Decorator,微網誌上有個人說decorator沒啥用,于是我就介紹個我在用的案例。
在Ubuntu Tweak這個項目當中,我使用logging來進行全局的log輸出。比如我經常會在一些函數中列印出這個函數的名字、參數等:
這種方式用的多了,也就煩了。因為每個函數的名稱不同,參數的個數與類型也不同,有沒有更簡單的方法來達到我的目的?于是我想到了decorator。我寫了下面這麼一個wrapper(decorator):
這個decorator是什麼意思呢?
很簡單,它接受一個log的參數,即傳入logger對象。然後它會先把函數名列印出來,接下來,會利用enumerate函數,将args、kwargs的任意參數給展開,并按順序輸出。最後,它再将func以這些參數包裝回去,繼續進行函數的執行和結果傳回。
那麼這個decorator如何用呢?
很簡單,最上面的那個函數,隻要這樣改就可以了。
這樣,如法炮制,就可以加在任何函數上面,完全用複制和粘貼就可以跟蹤函數的調用及參數。如果把這個decorator稍微加工一下,就可以也把傳回值也輸出。
我這個decorator比較簡單,用起來也比較簡單,但切合decorator的主要思路:
取得函數名以及所有參數
在執行函數前或執行函數後輸出相關資訊
是以,當我們遇到需要在執行函數前進行的一些檢測或預處理(pre),或者後處理(post),同時這部分操作又可以抽象出來的時候,decorator發揮的時候,就到了!
來源:http://imtx.me/archives/1706.html