我试图在 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
我希望能够测试是否已通过单元测试抛出警告。如果我只是打印出消息,我将无法使用单元测试中的assertRaises 来测试它。
你想要用的是
warnings.warn()
函数:
import warnings
def is_zero(i):
if i != 0:
print("OK")
else:
warnings.warn("The input is 0!", UserWarning)
return i
is_zero(0) # 这将发出警告,但不会引发错误
此代码将执行以下操作:
-
导入
warnings
模块。 这使你可以访问与警告相关的函数。 -
使用
warnings.warn()
发出警告。 此函数接收两个参数:警告消息和警告类别(可选)。在本例中,我们使用UserWarning
,但你也可以使用其他内置警告类别或创建自己的类别。
在单元测试中测试警告:
你可以使用
assertRaises(Warning)
或
assertWarns(Warning)
上下文管理器在单元测试中断言是否引发了警告。以下是一个示例:
import unittest
import warnings
class TestIsZero(unittest.TestCase):
def test_zero_input(self):
with self.assertWarns(UserWarning):
is_zero(0)
if __name__ == '__main__':
unittest.main()
此测试将通过,因为
is_zero(0)
调用将引发
UserWarning
。
使用
warnings.warn()
允许你发出警告,而不会像使用
raise Warning()
时那样中断程序。这也使你可以在单元测试中轻松测试这些警告。