Python等效于#ifdef DEBUG

Spu*_*dun 35 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
Run Code Online (Sandbox Code Playgroud)

有没有办法在python中执行此操作?

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

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

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

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

小智 69

__debug__在您的代码中使用:

if __debug__:
    print 'Debug ON'
else:
    print 'Debug OFF'
Run Code Online (Sandbox Code Playgroud)

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

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

观察差异.

  • 为什么 ```__debug__``` 默认为 true?默认情况下 ```__debug__``` false 和 python -O 将其设置为 true 不是更好吗? (4认同)
  • 因为-O中的O代表优化。它将 __debug__ 设置为 false,这会优化这些部分,并删除断言语句。-OO 还删除文档字符串。 (3认同)
  • 事实上,如果表达式是一个静态值(比如 `True`、`False`、`None`、`__debug__`、`0` 和 `0.0`),Python 完全删除了 `if` 语句,使得 `if __debug__` 是一个编译时指令,而不是运行时检查。(编辑:显然不能在注释中包含代码块;我想我会添加另一个答案) (2认同)

doc*_*red 15

穆罕默德的答案是正确的方法:使用if __debug__.

事实上,Python中完全消除if如果表达式是一个静态常数声明(如True,False,None,__debug__,0,和0.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
Run Code Online (Sandbox Code Playgroud)

我无法找到文档中明确说明的位置,尽管它提到了断言语句的类似优化.

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


das*_*zul 6

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

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

我建议先尝试pppp;)

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

  • cog.py是另一个很好的预处理器(预处理器语言本身是Python):http://nedbatchelder.com/code/cog/ (2认同)
  • 对于`#ifdef DEBUG` 的简单情况,`if __debug__` 是完全足够的,并且不会产生**无运行时成本**。见 /sf/answers/3207530441/ (2认同)