在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()
答案 0 :(得分:60)
在代码中使用__debug__
:
if __debug__:
print 'Debug ON'
else:
print 'Debug OFF'
使用上面的代码创建脚本abc.py
,然后
python -O abc.py
python abc.py
观察差异。
答案 1 :(得分:10)
Mohammad's answer是正确的方法:使用if __debug__
。
实际上,如果表达式是静态常量(例如if
,True
,False
,None
,Python会完全删除__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
我无法找到文档中明确说明的位置,尽管它提到assert statements的类似优化。
所以不要使用外部预处理器 - 为此目的,你有一个内置!
答案 2 :(得分:6)
您正在寻找的是python的预处理器。通常,您有三种选择:
我建议先尝试pppp;)
与设置DEBUG
标志和运行代码if (DEBUG == True)
相比,预处理器的主要优点是条件检查也会花费CPU周期,因此最好删除不需要运行的代码(如果python解释器无论如何都不这样做),而不是跳过它。
答案 3 :(得分:2)
如果您在Python中查找断言,assert
是一个实际有效的python语句。
http://docs.python.org/2/reference/simple_stmts.html#assert