我使用“警告”模块吗?

时间:2015-08-05 05:04:50

标签: python warnings

我正在使用它在解析配置文件时发出警告。这样做时会发生各种错误 - 有些是致命的,有些则不是。所有这些非致命错误都不应该中断解析,但它们也不能引起用户的注意。这是警告模块的用武之地。

我目前正在做这个(伪代码):

while parsing:
    try:
        get dictionary["token"]
    except KeyError:
        warnings.warn("Looks like your config file don't have that token")

这看起来既可读又舒适,但信息看起来像这样:

C:\Users\Renae\Documents\test.py:3: UserWarning: Looks like your config file don't have that token
  warnings.warn("Looks like your config file don't have that token")

为什么要打印两次?我应该在发出警告之前进行某种初始化(比如日志记录模块)吗?标准文档没有关于此的教程(或者是吗?)。

警告与print(),stdout或stderr的区别是什么?

1 个答案:

答案 0 :(得分:2)

当您使用warnings模块时,第二个打印实际上是堆栈,您可以使用stacklevel参数控制要打印的级别。示例 -

import warnings
def warn():
    warnings.warn("Blah",stacklevel=2)

warn()

结果 -

a.py:6: UserWarning: Blah
  warn()

如果您将其设置为不存在的级别,在上面的示例中可以说3,那么它不会打印堆栈,示例 -

def warn():
    warnings.warn("Blah",stacklevel=3)

结果 -

sys:1: UserWarning: Blah

虽然如您所见,该文件也已更改为sys:1。您可能希望在那里显示一个含义堆栈(对于发出警告的函数的调用者,可能类似于stacklevel = 2)。

另一种抑制方法是使用warnings.warn_explicit()方法并手动传入文件名和亚麻布(亚麻布不应该包含任何实际代码,否则会打印代码),尽管我不建议此

此外,是的,当使用warnings模块时,数据通常会进入sys.stderr,但您也可以使用不同的功能轻松地将警告发送到其他文件,例如 - warnings.showwarning()