2012-11-12 419 views
23

在C我們寫像Python的等價物的#ifdef DEBUG

#ifdef DEBUG 
printf("Some debug log... This could probably be achieved by python logging.Logger"); 
/* Do some sanity check code */ 
assert someCondition 
/* More complex sanitycheck */ 
while(list->next){ 
assert fooCheck(list) 
} 

#endif 

代碼有沒有辦法在Python做到這一點?

編輯:我得到了我的答案,以及更多:) 保羅,史蒂文倫巴斯基和J塞巴斯蒂安給了我我正在尋找的信息。感謝das的詳細答案,儘管我現在可能不會使用預處理器。

J塞巴斯蒂安,他的評論被刪除,因爲他發表評論的答案,刪除了他的答案,我想。他說我可以在記錄器中使用isEnabledFor()方法來提供一個條件。

謝謝大家的意見。這是我的第一個問題。我希望我能接受保羅,或者塞巴斯蒂安的答案。但由於這些是作爲評論提供的,我會接受達斯的答案。

我可能會使用兩種http://nestedinfiniteloops.wordpress.com/2012/01/15/if-debug-python-flavoured/或Logger.isEnabledFor()

+2

http://stackoverflow.com/questions/1593274/how-do-i-check-if-the-python-debug-option-is-set-from-within-a-script and http:// nestedinfiniteloops .wordpress.com/2012/01/15/if-debug-python-flavored/ –

+4

設置全局'DEBUG'並使用簡單的if-statment'如果DEBUG:...'有什麼問題? –

回答

6

你在找什麼是預處理器 for python。一般來說,你有三種選擇:

  1. 寫它傳遞的結果上解釋之前替換基於特定模板的源代碼的主要部分的自制腳本/程序(可能是困難的)
  2. 使用一個特殊的目的蟒蛇預處理像pppp - Poor's Python Pre-Processor
  3. 使用一個通用的預處理器一樣GPP

我建議首先嚐試PPPP;)

與設置DEBUG標誌和運行代碼if (DEBUG == True)相比,預處理器的主要優點是條件檢查也會花費CPU週期,所以最好刪除不需要運行的代碼(如果python解釋器不不管怎麼說),而不是跳過它。

+1

cog.py是另一個不錯的預處理器(預處理器語言本身就是Python):http://nedbatchelder.com/code/cog/ –

+0

它看起來像pppp的鏈接 - 上面的Poor's Python預處理器已經死機。這裏有一個鏈接到[github]上的代碼(https://github.com/pinard/Pymacs/blob/master/pppp.rst.in) – user2070305

+0

對於'#ifdef DEBUG'的簡單情況,'if __debug__' is完全足夠,並且產生**沒有運行時間成本**。請參閱https://stackoverflow.com/a/45821863/1752050 – doctaphred

39

使用__debug__在你的代碼:

if __debug__: 
    print 'Debug ON' 
else: 
    print 'Debug OFF' 

與上面的代碼創建一個腳本abc.py然後

  1. python -O abc.py
  2. 運行與python abc.py

運行觀察區別。

+0

事實上,如果表達式是靜態值(例如'True','False','None','__debug__ ','0'和'0.0'),使得'if __debug__'成爲編譯時指令而不是運行時檢查。 (編輯:顯然不能在評論中包括代碼塊;猜我會添加另一個答案) – doctaphred

4

Mohammad's answer是正確的方法:使用if __debug__

事實上,Python中如果表達式是一個靜態常數(如TrueFalseNone__debug__0,和0.0),使得if __debug__編譯時指令,而不是一個運行時檢查完全消除if語句:

>>> def test(): 
...  if __debug__: 
...   return 'debug' 
...  return 'not debug' 
... 
>>> import dis 
>>> dis.dis(test) 
    3   0 LOAD_CONST    1 ('debug') 
       2 RETURN_VALUE 

我找不到在哪裏,這是明確的文件所述,雖然提到了assert statements類似的優化。

所以不要使用外部預處理器 - 爲此,您有一個內置的!

+0

給+1回覆:) –