使用打印语句只进行debugging

最近我在Python中编写了很多代码。 而且我一直在处理之前没有使用的数据,使用以前从未见过的公式和处理大文件的数据。 所有这些让我写了大量的打印语句来validation它是否正确并确定了失败点。 但是,一般来说,输出这么多的信息并不是一个好的做法。 我如何才能使用打印语句,当我想要debugging,并让他们被跳过,当我不希望他们打印?

logging模块有你想要的一切。 起初可能看起来过多,但只能使用你需要的部分。 我build议使用logging.basicConfig将日志级别切换到stderr以及简单的日志方法 , 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)) 

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

你创build一个Logger对象(比如说logger ),然后在你插入一个debugging打印的时候,你只需要input:

 logger.debug("Some string") 

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

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

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

 DEBUG = True def log(s): if DEBUG: print s log("hello world") 

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

标准logging模块具有更复杂的机制。

我不知道别人,但是我习惯于定义一个“全局常量”DEBUG ),然后是一个全局函数( debug(msg) ),只有在DEBUG == True才会打印msg

然后我写我的debugging声明,如:

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

…然后我拿起unit testing ,从来没有这样做过! 🙂

首先,我会提名python的日志框架。 不过,要小心一点。 具体来说:让日志框架扩展你的variables,不要自己动手。 例如,而不是:

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

确保你做到:

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

因为尽pipe它们看起来相似,但是即使它被禁用 ,第一个版本也会产生repr()成本。 第二个版本避免这一点。 同样,如果你推出自己的,我会build议像这样的:

 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 

计算这些string的开销可能并不重要,除非它们要么计算起来昂贵,要么2)debugging语句在n ^ 3循环等等的中间。 我并不知道这件事。