我正在使用它在解析配置文件时发出警告。这样做时会发生各种错误 - 有些是致命的,有些则不是。所有这些非致命错误都不应该中断解析,但它们也不能引起用户的注意。这是警告模块的用武之地。
我目前正在做这个(伪代码):
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的区别是什么?
答案 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()