Python等效于#ifdef DEBUG

时间:2012-11-12 22:33:08

标签: python debugging

在C中我们编写像

这样的代码
#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中执行此操作?

编辑:我得到了答案,还有更多:) Paolo,Steven Rumbalski和J Sebastian给了我正在寻找的信息。感谢das的详细解答,虽然我现在可能不会使用预处理器。

J塞巴斯蒂安,他的评论被删除,因为他发表评论的答案,我认为删除了他的答案。 他说我可以在Logger中使用isEnabledFor()方法来提供条件。

感谢大家的投入。这是我的第一个问题。我希望我能接受保罗,或塞巴斯蒂安的答案。但由于那些是作为评论提供的,我会接受das'回答。

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

4 个答案:

答案 0 :(得分:60)

在代码中使用__debug__

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

使用上面的代码创建脚本abc.py,然后

  1. 使用python -O abc.py
  2. 运行
  3. 使用python abc.py
  4. 运行

    观察差异。

答案 1 :(得分:10)

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

实际上,如果表达式是静态常量(例如ifTrueFalseNone,Python会完全删除__debug__语句, 00.0),使if __debug__成为编译时指令而不是运行时检查:

>>> 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的类似优化。

所以不要使用外部预处理器 - 为此目的,你有一个内置!

答案 2 :(得分:6)

您正在寻找的是python的预处理器。通常,您有三种选择:

  1. 编写自制脚本/程序,在将结果传递给解释器之前,根据某些模板替换部分源代码(可能很难)
  2. 使用特殊用途的python预处理器,如pppp - Poor's Python Pre-Processor
  3. 使用GPP
  4. 等通用预处理程序

    我建议先尝试pppp;)

    与设置DEBUG标志和运行代码if (DEBUG == True)相比,预处理器的主要优点是条件检查也会花费CPU周期,因此最好删除不需要运行的代码(如果python解释器无论如何都不这样做),而不是跳过它。

答案 3 :(得分:2)

如果您在Python中查找断言,assert是一个实际有效的python语句。 http://docs.python.org/2/reference/simple_stmts.html#assert