在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()方法来填充一个条件。
感谢大家的意见。这是我的第一个问题。我希望我能接受保罗或塞巴斯蒂安的答案。但既然这些都是作为评论提供的,我会接受他们的答案。
我可能会使用http://nestedinfiniteloops.wordpress.com/2012/01/15/if-debug-python-flavoured/或Logger.isEnabledFor()
6条答案
按热度按时间0yycz8jy1#
在代码中使用
__debug__
:使用上面的代码创建一个脚本
abc.py
,然后1.以
python -O abc.py
执行1.以
python abc.py
执行观察差异。
acruukt92#
Mohammad's answer是正确的方法:请使用
if __debug__
。事实上,如果表达式是一个静态常量(例如
True
、False
、None
、__debug__
、0
和0.0
),Python会完全删除if
语句,使if __debug__
成为一个编译时指令,而不是运行时检查:-O
选项在命令行选项的python文档中有详细解释,对于assert语句也有类似的优化。因此,不要使用外部预处理器-为此,您已经内置了一个预处理器!
piztneat3#
你要找的是一个python的预处理器。通常你有三个选择:
1.编写一个自制脚本/程序,在将结果传递给解释器之前,根据特定模板替换部分源代码(可能比较困难)
1.使用特殊用途的python预处理器,如pppp - Poor's Python Pre-Processor
1.使用GPP之类的通用预处理器
我建议先试试pppp;)
与设置
DEBUG
标志并运行代码if (DEBUG == True)
相比,预处理器的主要优点是条件检查也会占用CPU周期,因此最好删除不需要运行的代码(如果python解释器无论如何都不这样做的话),而不是跳过它。n9vozmp44#
如果你在Python中寻找Assert,
assert
是一个实际有效的Python语句。http://docs.python.org/2/reference/simple_stmts.html#assertlbsnaicq5#
检查sys.gettrace()的结果是否为None。这意味着没有调试器
oyxsuwqo6#
我使用另一种方法--将测试模块作为单机/直接运行:
它提供了灵活性,可以在独立调试为True时,作为项目内的模块运行调试为False。例如,这适用于从本地文件或从请求加载数据:
它也帮助我控制一个依赖于DEBUG模式的路径。正如你所知道的,当模块放在一个主代码的不同目录中时,路径将是“module”目录,以防我们作为独立的模块运行(用于测试),但当我们从“main”中的这个模块实现方法时,路径将设置为你项目的根目录。所以你可以使用DEBUG来调整不同情况下的路径
(or您可以直接在“if name == 'main':“中更改”路径“)