仅使用 print 语句进行调试

最近我用 Python 编写了很多代码。我一直在处理以前从未处理过的数据,使用以前从未见过的公式,处理巨大的文件。所有这些让我写了很多 print 语句来验证是否一切正常,并确定故障点。但是,总的来说,输出如此多的信息并不是一个好的做法。如何仅在希望调试时使用 print 语句,并在不希望打印时跳过它们?

138398 次浏览

logging模块拥有你想要的一切。一开始可能看起来有点过分,但是只用你需要的部分。我建议使用 logging.basicConfig将日志记录级别切换到 stderrlogging.basicConfig0、 debuginfowarningerrorcritical

import logging, sys
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logging.debug('A debug message!')
logging.info('We processed %d records', len(processed_records))

使用 伐木内置的库模块代替打印。

创建一个 Logger对象(比如 logger) ,然后在此之后,无论何时插入调试打印,都只需输入:

logger.debug("Some string")

您可以在程序开始时使用 logger.setLevel来设置输出级别。如果您将其设置为 DEBUG,它将打印所有的调试。将其设置为 INFO 或更高,所有的调试将立即消失。

您还可以使用它来记录更严重的事情,在不同的级别(信息、警告和错误)。

一个简单的方法是调用一个日志函数:

DEBUG = True


def log(s):
if DEBUG:
print s


log("hello world")

然后,您可以更改 DEBUG的值,并在有或没有日志记录的情况下运行代码。

标准的 logging模块对此有更详细的机制。

我不知道其他人,但我被用来定义一个 “全球常数”(DEBUG) ,然后一个全局函数(debug(msg)) ,将打印 msg只有当 DEBUG == True

然后我写下我的调试语句,比如:

debug('My value: %d' % value)

... 然后我拿起 单元测试再也不这么做了! :)

首先,我将再次提名 python 的 伐木框架。但是,对于如何使用它,要小心一点。具体来说: 让日志框架扩展您的变量,不要自己动手。例如:

logging.debug("datastructure: %r" % complex_dict_structure)

一定要做到:

logging.debug("datastructure: %r", complex_dict_structure)

因为虽然它们看起来很相似,但是第一个版本的 repr ()成本是 即使它被禁用了。第二个版本避免了这一点。同样,如果你自己卷,我建议你这样:

def debug_stdout(sfunc):
print(sfunc())


debug = debug_stdout

电话:

debug(lambda: "datastructure: %r" % complex_dict_structure)

如果你通过以下方法禁用它,它将再次避免开销:

def debug_noop(*args, **kwargs):
pass


debug = debug_noop

计算这些字符串的开销可能并不重要,除非它们1)计算成本高,或者2)调试语句处于 n ^ 3循环或其他循环的中间。虽然我不知道这事。

调试代码的更好方法是使用模块 clrprint

只有在传递参数 debug = True 时,它才打印颜色完整的输出

from clrprint import *
clrprint('ERROR:', information,clr=['r','y'], debug=True)