robot
最新文章(10)
Mqskit 和其它相關工具
CPython 的 GC 二、三事
寫 Mecurial Extension 是件快樂的事!
Mozilla 台灣辨公室徵人啟事
關於 Apple 的兩項專利
core dump 之前的 frame
怎麼發出 beep 聲?
先承認你要找的是奴才吧!
程式碼要清的多乾淨?
FreeBSD 的 Thread-Local Storage 實作
首頁
新編
最新留言
Entries RSS
重要關鍵字(10)
coding (122)
Python (93)
FreeBSD (71)
WEB (61)
URL (48)
hardware (46)
javascript (36)
Linux (34)
blog (30)
C++ (16)
所有關鍵字
新增 URL
Python Decorator 之一
by thinker
2 Columns
關鍵字:
Python
coding
$Python$ linkname:decorator http://docs.python.org/ref/function.html 也是很重要的 meta-programming 支援功能,有多重要。其實一點也不重要,但少了 decorator 就會減少程式的美感。 Decorator 其實就是為了少寫那麼一行 code。如, {{{ def foo(): pass foo = boo(foo) }}} 可以寫成 {{{ @boo def foo(): pass }}} 透過前置的語法,能較後置的風格容易讓人了解。 Decorator 的前置風格,隱藏著宣告的意味。因此,大腦在解讀時,也就能更快速的了解其意圖。 Decorator 有什麼用? 例如我寫了一個簡單的工具, {{{ def catch_on(excepts, act): def get_call(call): def calling(*args, **kws): try: return call(*args, **kws) except Exception, e: pass if not isinstance(e, excepts): raise return act() return calling return get_call }}} 這個工具能在下面例子發揮作用 {{{ @catch_on((KeyError, ValueError), lambda: None) def foo(): ......... boo() # will raise KeyError() ......... bar() # will raise ValueError() ........ }}} 此例是,當 function 內部出現 KeyError 或 ValueError 時,就傳回 None, 代替 raise exception。如此針對 function 本身進行宣告式的處理,能讓程式碼更容易被大腦了解。你也不必在程式碼裡,不斷重複著類似的程式碼,並將意外處理的邏輯和主要流程混在一起。 你也可以透過 decorator 為重要的 function 做 log。例如, {{{ def log(logfile): def assign_call(call): return lambda *args, **kws: logfile.write(call.__name__) and call(*args, **kws) return assign_call @log(file('my.log')) def foo(boo): ........ }}} 諸如此類和 function 本身主要流程比較無關的程式碼,進行分離。以宣告的方式告訴讀程式碼的人。 == 好與壞 == 一個程式語言的好與壞,除了功能的豐富和效率之外,閱讀性也是很重要的一點。 $Python$ 在這方面的表現相當的突出,由其是近來一連串的改變,能讓桯式碼的可讀性更進一步。五洲製藥的吳董事長不是說了嗎?「先$研究$無傷身體,才求藥效」。我在這改了一下,「先$研究$好讀,才求速度」。速度是最後才求的,而速度也是最容易求到的。除非您有特別的需。
最後更新時間: 2007-01-13 22:47:53 CST |
引用
查詢:
COMMENTS: