2011-05-19 41 views
2

我正在寫一個實用程序模塊,以便於處理數據文本文件。我已經聲明瞭一些模塊級別的常量來爲我的方法參數提供默認值,因爲現在我只使用這些值,但我希望我的代碼很容易適應。什麼是用計算值聲明模塊級常量的pythonic /更快的方法?

但是一些常數不容易硬編碼。例如repattern對象我只能用re.compile得到。所以我寫了

import re 

_my_fine_pattern_string = r"some obnoxious regex" 
MY_FINE_PATTERN   = re.compile(_my_fine_pattern_string) 

def spam(eggs): 
... 

它昨天在我直接執行的腳本內工作。但現在我想知道。此代碼是否會在import上執行?它會減緩執行嗎?我會因此而被燒嗎?有沒有更好/更快的方法來做到這一點?

回答

6

是的,這很好。它將在導入時執行。如果你有大量的計算要做(不是re.compile),它會減慢導入的速度 - 但這是應該的,因爲無論如何你需要常量來完成你的工作。

爲什麼使用雙下劃線名稱?如果常量是要導出的,它們不應該以下劃線作爲前綴,如果不是,那麼它們應該有一個下劃線。 (Double在類繼承的上下文中具有特定含義,但通常不應在其他地方使用)。

+0

哦好吧,我認爲雙下劃線是「不出口」的成語。編譯的模式不應該有一個。我編輯問題。謝謝。 – Evpok 2011-05-19 13:47:12

+0

@Evpok的旁註 - 通過在[PEP8](http://www.python.org/dev/peps/pep-0008/)中搜索「single_leading_underscore」,可以找到python下劃線約定的完整列表。模塊中沒有使用「__attr」的主要原因是「__attr」與「_attr」的不同行爲僅僅是類需要的,所以模塊中較短的一個是首選。否則,這將是完美的感覺:) – 2011-05-19 19:48:04

+0

哦,沒有看到我們讀過它。雖然我不喜歡所有這些建議,但這個建議確實很明顯。謝謝。 – Evpok 2011-05-19 20:01:26

1

它將在導入時執行,不用擔心。 AFAIK這是最好的方式,如果你的正則表達式經常使用。

2

模塊級常量應始終使用UPPER_CASE_WITH_UNDERSCORES(請參閱Python Style Guide!)命名。

MY_FINE_PATTERN_STRING = r"some obnoxious regex" 
MY_FINE_PATTERN = re.compile(_my_fine_pattern_string) 

它絕對會在導入時執行。這真的取決於你正在執行的設置。在這樣的大多數情況下,如果您正在執行諸如預編譯re模式的小設置操作,資源命中是微不足道的。

現在不用擔心預先優化。完成你的代碼,如果你遇到瓶頸,profile你的代碼找出是什麼原因造成的。

+0

已編輯的問題。模式字符串不應該是公共的,所以它會是'_underscored_lowercase',只有編譯的模式纔會是'UPPER_CASE_WITH_UNDERSCORES'。 我不得不盡可能優化我的代碼,這些意味着要應用於大型轉錄(+100 000行)的演講,我想避免不得不重構我的代碼。雖然我不知道這個簡介,但我會閱讀這份文檔。謝謝。 – Evpok 2011-05-19 13:53:15

+0

不客氣! – jathanism 2011-05-19 20:22:50

相關問題