Skip to main content

12.断言

断言:assert

断言常用于单元测试,如果断言失败(False),那么代码会被终止(抛出一个 AssertionError)。比如:

n = 0
assert(n != 0)
1 / n
---------------------------------------------------------------------------

AssertionError Traceback (most recent call last)

<ipython-input-112-e53f92f6c644> in <module>()
1 n = 0
----> 2 assert(n != 0)
3 1 / n


AssertionError:

断言语句可以用命令行参数 -O 忽略。这样所有的 assert() 语句都不会被执行。

$ python -O main.py

日志调试:logging 模块

logging 模块支持将错误日志输出(到控制台或者到文件)。

此乃调试神器。延伸阅读: logging 官方基础教程。

import logging
# 该行也可能通过控制台:$ python main.py --log=WARNING 的方式实现
logging.basicConfig(level=logging.WARNING)
n = 0
logging.warning("n = {}".format(n))
WARNING:root:n = 0

logging 模块的灵活之处在于你可以记录信息的级别(DEBUG,INFO,WARNING,ERROR,CRITICAL),各级别的作用如下:

  • DEBUG:最详细的级别,所有详细日志都会被输出。
  • INFO:检测代码是否按照预期执行。
  • WARNING:非预期的事件发生了,或者可能在近期发生(例如:低磁盘空间)。但代码仍然执行。
  • ERROR:发生了级别更高的问题,某些功能无法正常实现。
  • CRITICAL:严重错误,代码可能无法继续运行。 通过 filename 参数,可以将日志写入到文件。一般使用 DEBUG 级别,即输出所有信息。
# logging.basicConfig(filename="log.log", level=logging.DEBUG)

默认会将日志追加到文件末尾,如果想要覆写文件而不是追加,使用 filemode 参数:

# logging.basicConfig(filename="log.log", filemode="w", level=logging.DEBUG)

更改日志格格式,使用 format 参数。一般来说,常用的格式码(格式码后加 s 表示字符串)有:

  • %(levelname):当前日志字串级别。
  • %(message):当前日志字串。
  • %(asctime):当前时间。默认 datefmt 参数为 %Y-%m-%d %I:%M:%S 例子。下例会输出形如:”01/23/1900 08:05:05 PM is when this event was logged.” 这样的格式。
# logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
# logging.warning('is when this event was logged.')
# 常用的格式:
# logging.basicConfig(format="%(levelname)s: %(message)s")

还可以通过配置文件来代替 basicConfig 命令,并进行设置 logger 等更高级的配置。这部分可以参考:此处。

# import logging.config

# logging.config.fileConfig('logging.conf')