debugging # ifdef DEBUG的Python等效项

qyswt5oh  于 2022-11-24  发布在  Python
关注(0)|答案(6)|浏览(165)

在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()

0yycz8jy

0yycz8jy1#

在代码中使用__debug__

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

使用上面的代码创建一个脚本abc.py,然后
1.以python -O abc.py执行
1.以python abc.py执行
观察差异。

acruukt9

acruukt92#

Mohammad's answer是正确的方法:请使用if __debug__
事实上,如果表达式是一个静态常量(例如TrueFalseNone__debug__00.0),Python会完全删除if语句,使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语句也有类似的优化。
因此,不要使用外部预处理器-为此,您已经内置了一个预处理器!

piztneat

piztneat3#

你要找的是一个python的预处理器。通常你有三个选择:
1.编写一个自制脚本/程序,在将结果传递给解释器之前,根据特定模板替换部分源代码(可能比较困难)
1.使用特殊用途的python预处理器,如pppp - Poor's Python Pre-Processor
1.使用GPP之类的通用预处理器
我建议先试试pppp;)
与设置DEBUG标志并运行代码if (DEBUG == True)相比,预处理器的主要优点是条件检查也会占用CPU周期,因此最好删除不需要运行的代码(如果python解释器无论如何都不这样做的话),而不是跳过它。

n9vozmp4

n9vozmp44#

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

lbsnaicq

lbsnaicq5#

检查sys.gettrace()的结果是否为None。这意味着没有调试器

import sys
if sys.gettrace():
    print("debug mode!")
else:
   print("debug mode is off!")
oyxsuwqo

oyxsuwqo6#

我使用另一种方法--将测试模块作为单机/直接运行:

import ...

DEBUG = False

....

def main():
    pass

if __name__ == '__main__':
    DEBUG = True
    main()

它提供了灵活性,可以在独立调试为True时,作为项目内的模块运行调试为False。例如,这适用于从本地文件或从请求加载数据:

def load_csv():
    fn = get_csv_filename()  # will return path depending DEBUG
    if DEBUG:
        if not exists(fn):
            store_df(request_bond_list(), fn)
        return pd.read_csv(fn)
    return request_bond_list()

它也帮助我控制一个依赖于DEBUG模式的路径。正如你所知道的,当模块放在一个主代码的不同目录中时,路径将是“module”目录,以防我们作为独立的模块运行(用于测试),但当我们从“main”中的这个模块实现方法时,路径将设置为你项目的根目录。所以你可以使用DEBUG来调整不同情况下的路径
(or您可以直接在“if name == 'main':“中更改”路径“)

相关问题