Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何模仿C';s#定义可以选择在Python中打印调试输出的功能?_Python_C_Debugging_Preprocessor Directive - Fatal编程技术网

如何模仿C';s#定义可以选择在Python中打印调试输出的功能?

如何模仿C';s#定义可以选择在Python中打印调试输出的功能?,python,c,debugging,preprocessor-directive,Python,C,Debugging,Preprocessor Directive,我有一个巨大的python代码,其中有许多用于调试的打印语句。我希望能够一次启用或禁用它们,而无需仔细研究成百上千的printf,每次都对它们进行注释 在C语言中,可以使用#define注释掉代码中不需要的部分,如下面的#ifdef- #define debug #ifdef debug printf("Debug on") #endif 如果我不想处于调试模式,我可以简单地注释#define debug,我的print语句都不会编译 如何在Python中实现这一功能?Python与C

我有一个巨大的python代码,其中有许多用于调试的打印语句。我希望能够一次启用或禁用它们,而无需仔细研究成百上千的
printf
,每次都对它们进行注释

在C语言中,可以使用
#define
注释掉代码中不需要的部分,如下面的
#ifdef
-

#define debug
#ifdef debug
    printf("Debug on")
#endif
如果我不想处于调试模式,我可以简单地注释#define debug,我的
print
语句都不会编译


如何在Python中实现这一功能?

Python与C的宏没有直接的等价物,因为它没有预处理器,也不像C那样区分编译时和运行时

但是,一个简单的解决方案是将
打印
行放入if语句中:

if False:
    print(...)
    print(...)
    print(...)
    ...
然后,只需将
False
更改为
True
,即可执行它们


同样,您可以:

DEBUG = False

if DEBUG:
    print(...)
    print(...)
    print(...)
    ...
然后将
DEBUG
名称更改为
True


第三个(可能是最好的)选项是使用Python的内置:


\uuuu调试\uuuu
是一个类似于
None
的常量,如果启动Python时没有
-O
选项(它处于调试模式),则设置为
True
。否则,如果设置了
-O
选项(我们处于优化/生产模式),
\uuu调试\uuu
将设置为
False
,并且解释器将完全忽略使用它的代码,这样就不会造成性能损失。

您应该查看Python日志库:


使用python标准库模块。这是一个例子

您可以像这样设置给定代码运行的调试级别(有关更多信息,请参阅):

因此,如果您选择这样做,您甚至可以在命令行上通过调试级别,比如执行以下操作

--loggingLevel=DEBUG

由于C宏是在编译时计算的,以简化运行时,而且Python没有这种分离,因此这种功能在Python中没有多大意义。您只需使用正常的运行时检查来进行分支(读:简单的ifs)。同样相关的:使用
if\uuuu调试\uuuu
。此标志由
-O
选项设置,在生产(优化)模式下运行时,它实际上会删除代码,因此没有性能损失。谢谢,我忘记了
\uuuu调试\uu
import logging
# if you want you can also set filename="logfile.txt" to write to file
logging.basicConfig(level=logging.DEBUG) # there are other options like logging.INFO
x = 42.31415
# Run your program here....
logging.debug("x is now" + str(x))
--loggingLevel=DEBUG