仅使用print语句进行调试

时间:2011-07-05 07:55:46

标签: python

我最近在Python中编写了大量代码。我一直在处理以前没有使用的数据,使用以前从未见过的公式和处理大文件。所有这些让我写了很多印刷语句来验证它是否一切顺利并确定失败点。但是,一般来说,输出如此多的信息并不是一种好的做法。如果我想调试时如何使用print语句,当我不希望它们被打印时让它们被跳过?

6 个答案:

答案 0 :(得分:136)

logging模块包含您想要的所有内容。一开始可能看起来过多,但只使用您需要的部件。我建议使用logging.basicConfig将日志记录级别切换为stderrsimple log methodsdebuginfowarning,{{1 }和error

critical

答案 1 :(得分:23)

执行此操作的一种简单方法是调用日志记录功能:

DEBUG = True

def log(s):
    if DEBUG:
        print s

log("hello world")

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

标准logging模块有一个更精细的机制。

答案 2 :(得分:18)

使用logging内置库模块而不是打印。

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

logger.debug("Some string")

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

您还可以使用它来记录不同级别的更严重的事情(INFO,WARNING和ERROR)。

答案 3 :(得分:6)

我不了解其他人,但我习惯于定义“全局常量”DEBUG),然后定义一个全局函数(debug(msg))仅在msg

时打印DEBUG == True

然后我编写调试语句,如:

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

...然后我选择单元测试,再也没有这样做过! :)

答案 4 :(得分:6)

首先,我将提名python的logging框架。但是,要小心你如何使用它。具体来说:让日志框架扩展您的变量,不要自己动手。例如,而不是:

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

计算这些字符串的开销可能并不重要,除非它们要么计算成本高昂,要么2)调试语句位于例如n ^ 3循环或其他东西的中间。并不是说我对此一无所知。

答案 5 :(得分:0)

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

仅当通过参数debug = True时,才打印彩色全输出

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