我试图在Python中提出警告,而不使程序崩溃/停止/中断。

我使用下面的简单函数来检查用户是否传递了一个非零的数字给它。如果是这样,程序应该警告他们,但照常进行。它应该像下面的代码一样工作,但是应该使用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中的assertRaises测试它。


当前回答

你不应该引发警告,你应该使用警告模块。提高它会产生错误,而不是警告。

其他回答

import warnings
warnings.warn("Warning...........Message")

查看python文档:这里

默认情况下,与异常不同,警告不会中断。

在导入警告之后,可以在生成警告时指定warnings类。如果没有指定,则默认为UserWarning。

>>> 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。

只是一个小的演示片段

我有点困惑如何使用警告。所以我在这里提供了一个简短的演示。注意print(“警告后运行的代码”)是如何在警告后执行/不执行的。warn / raise用户警告。还警告。Warn只打印一次警告消息。

>>> 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

你不应该引发警告,你应该使用警告模块。提高它会产生错误,而不是警告。