2014-11-21 54 views
4

我有一個巨大的python代碼,有很多打印語句對調試很有用。我希望能夠一次性啓用或禁用它們,而無需每次仔細閱讀數百個printf並對它們進行評論。如何模仿C的#define功能來選擇性地在Python中打印調試輸出?

在C中,#define可用於使用#ifdef喜歡這個 -

#define debug 
#ifdef debug 
    printf("Debug on") 
#endif 

註釋掉的代碼不需要的部分。如果我不希望在調試模式下,我可以簡單地評論的#define調試和我的print語句都不會編譯。

這個功能如何在Python中完成?

+0

由於在編譯時計算C宏以簡化運行時,並且由於Python沒有這種分離,所以這種功能在Python中沒有多大意義。你可以使用正常的運行時檢查來創建分支(閱讀:簡單的ifs)。 – poke 2014-11-21 21:47:55

+0

也相關:http://stackoverflow.com/questions/482014/how-would-you-do-the-equivalent-of-preprocessor-directives-in-python – 2014-11-21 22:54:27

回答

4

Python沒有與C的宏直接等價,因爲它沒有預處理器,並且不像C那樣區分編譯時和運行時。然而

一個簡單的辦法是把你print行內的if語句:

if False: 
    print(...) 
    print(...) 
    print(...) 
    ... 

然後,您可以只改變FalseTrue讓他們執行。


同樣,你可以這樣做:

DEBUG = False 

if DEBUG: 
    print(...) 
    print(...) 
    print(...) 
    ... 

,然後更改DEBUGTrue


第三個(也可能是最好的)選擇是使用Python的內置__debug__ flag

if __debug__: 
    print(...) 
    print(...) 
    print(...) 
    ... 

__debug__是一個常數像None和Python是否沒有啓動設置爲True-O選項(它處於調試模式)。否則,如果設置了-O選項(我們處於優化/生產模式),則__debug__將設置爲False,並且使用它的代碼將完全被解釋器忽略,因此不會影響性能。

+1

使用'if __debug__'。該標誌由「-O」選項設置,實際上在生產(優化)模式下運行時剝掉代碼,因此不會影響性能。 – kindall 2014-11-21 23:37:59

+0

謝謝,我忘了'__debug__'。 – iCodez 2014-11-21 23:55:53

1

使用Python標準庫logging模塊。這是一個easier-to-read tutorial on the logging module

您可以爲您的代碼就像一個給定的運行調試級左右(見this section更多信息):

import logging 
# if you want you can also set filename="logfile.txt" to write to file 
logging.basicConfig(level=logging.DEBUG) # there are other options like logging.INFO 
x = 42.31415 
# Run your program here.... 
logging.debug("x is now" + str(x)) 

所以你甚至可以通過在命令行調試級別,如果你選擇,比如說做類似

--loggingLevel=DEBUG