提问人:Tomas Novotny 提问时间:10/8/2010 最后编辑:pfabriTomas Novotny 更新时间:5/18/2022 访问量:303809
在不中断程序的情况下在 Python 中引发警告
Raise warning in Python without interrupting program
问:
我试图在不使程序崩溃/停止/中断的情况下在 Python 中发出警告。
我使用以下简单函数来检查用户是否向它传递了一个非零数字。如果是这样,程序应该警告他们,但照常继续。它应该像下面的代码一样工作,但应该使用 class ,或者而不是手动打印警告。Warning()
Error()
Exception()
def is_zero(i):
if i != 0:
print "OK"
else:
print "WARNING: the input is 0!"
return i
如果我使用下面的代码并将 0 传递给函数,程序会崩溃并且永远不会返回值。相反,我希望程序正常继续,并通知用户他将 0 传递给函数。
def is_zero(i):
if i != 0:
print "OK"
else:
raise Warning("the input is 0!")
return i
我希望能够测试是否已通过 unittest 测试警告。如果我只是简单地打印出消息,则无法在 unittest 中使用 assertRaise 对其进行测试。
答:
你不应该使用警告,你应该使用警告
模块。通过引发它,您正在生成错误,而不是警告。raise
评论
可用的warnings.catch_warnings
上下文管理器可以让你这样做。
import warnings
warnings.warn("Warning...........Message")
请参阅 python 文档:此处
评论
warnings.warn("blabla", DeprecationWarning)
默认情况下,与异常不同,警告不会中断。
之后,可以在生成警告时指定 Warnings 类。如果未指定,则默认情况下,它实际上是 UserWarning
。import warnings
>>> warnings.warn('This is a default warning.')
<string>:1: UserWarning: This is a default warning.
简单地使用预先存在的类,例如 DeprecationWarning
:
>>> warnings.warn('This is a particular warning.', DeprecationWarning)
<string>:1: DeprecationWarning: This is a particular warning.
创建自定义警告类类似于创建自定义异常类:
>>> class MyCustomWarning(UserWarning):
... pass
...
... warnings.warn('This is my custom warning.', MyCustomWarning)
<string>:1: MyCustomWarning: This is my custom warning.
对于测试,请考虑 assertWarns
或 assertWarnsRegex
。
作为替代方案,特别是对于独立应用程序,请考虑使用该模块。它可以记录具有调试、信息、警告、错误等级别的消息。默认情况下,具有警告级别或更高级别的日志消息将打印到 stderr。logging
只是一个小小的演示片段
我有点困惑如何使用,所以我在这里提供了一个简短的演示。注意 print(“warning 后运行的代码”) 是如何执行/不执行的。此外,warnings.warn 仅打印一次警告消息。warnings.warn
warnings.warn
raise UserWarning
>>> import warnings
>>>
>>> warnings.warn("test warning"); print("code running after warning")
<stdin>:1: UserWarning: test warning
code running after warning
>>>
>>> raise UserWarning('test warning'); print("code running after warning")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UserWarning: test warning
>>>
>>> warnings.warn("test warning"); print("code running after warning")
code running after warning
评论
print