55

在 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 Sebastian,他的评论被删除了,因为他发表评论的答案,我认为删除了他的答案。他说我可以使用 Logger 中的 isEnabledFor() 方法来提供条件。

感谢大家的投入。这是我的第一个问题。我希望我能接受 paolo 或 j sebastian 的回答。但由于这些是作为评论提供的,我会接受 das 的回答。

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

4

4 回答 4

109

__debug__在您的代码中使用:

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

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

  1. 运行python -O abc.py
  2. 运行python abc.py

观察差异。

于 2014-12-13T04:05:52.203 回答
35

Mohammad 的回答是正确的方法:使用if __debug__.

事实上,if如果表达式是静态常量(例如TrueFalseNone__debug__00.0),Python 会完全删除该语句,从而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

该选项在命令行选项-O的 python 文档中有详细说明,并且对assert 语句也有类似的优化。

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

于 2017-08-22T15:35:58.570 回答
11

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

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

我建议先尝试 pppp ;)

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

于 2012-11-12T22:45:38.820 回答
2

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

于 2012-11-12T22:40:02.077 回答