2012-11-12 394 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回复:) –