使用打印语句只进行debugging
最近我在Python中编写了很多代码。 而且我一直在处理之前没有使用的数据,使用以前从未见过的公式和处理大文件的数据。 所有这些让我写了大量的打印语句来validation它是否正确并确定了失败点。 但是,一般来说,输出这么多的信息并不是一个好的做法。 我如何才能使用打印语句,当我想要debugging,并让他们被跳过,当我不希望他们打印?
logging
模块有你想要的一切。 起初可能看起来过多,但只能使用你需要的部分。 我build议使用logging.basicConfig
将日志级别切换到stderr
以及简单的日志方法 , debug
, info
, warning
, error
和critical
。
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循环等等的中间。 我并不知道这件事。