在Python中处理NumPy测试的异常断言



了解某人的代码并满足以下条件:

有一个功能:

def some_func():
print("Hello")
assert(len(y)==len(p))
print("First assert")
assert(p.all()<=0.99999)
print("Second assert")
return 1

接下来,调用assert_raises:

np.testing.assert_raises(AssertionError, some_func, np.asarray([1, 2, 3]), np.asarray([1, 2, 3, 4, 5]))

在输出中,我们只得到Hello,没有异常消息:

Hello

接下来,调用函数assert_array_less:

np.testing.assert_array_less(some_func(np.asarray([1, 2, 3]), np.asarray([1, 2, 3])), np.inf)

在输出中,我们得到Hello First断言,然后是一条错误消息和一个AssertionError异常:

Hello
First assert
---------------------------------------------------------------------------
AssertionError  Traceback (most recent call last)
<ipython-input-26-df1a32b4f5a0> in <module>()
9 np.testing.assert_raises(AssertionError, some_func, np.asarray([1, 2, 3]), np.asarray([1, 2, 3, 4, 5]))
10 
---> 11 np.testing.assert_array_less(some_func(np.asarray([1, 2, 3]), np.asarray([1, 2, 3])), np.inf)
<ipython-input-26-df1a32b4f5a0> in some_func(a, b)
3     assert(len(a)==len(b))
4     print("First assert")
----> 5     assert(a.all()<=0.99999)
6     print("Second assert")
7     return 1
AssertionError: 

问题:

为什么在1种情况下,尽管在some_func((中调用了first-assert,但代码只是停止并且没有抛出异常

为什么第二个没有像第一个一样发生,并且抛出了异常

根据您显示的错误消息,我猜some_func函数的实际定义是:

def some_func(a, b):
print("Hello")
assert(len(a)==len(b))
print("First assert")
assert(a.all()<=0.99999)
print("Second assert")
return 1

鉴于此,以下是您在assert呼叫期间发生的事情的确切摘要:

  • 您呼叫

    np.testing.assert_raises(AssertionError, some_func, np.asarray([1, 2, 3]), np.asarray([1, 2, 3, 4, 5]))
    
    • np.testing.assert_raises函数依次调用

      some_func(np.asarray([1, 2, 3]), np.asarray([1, 2, 3, 4, 5]))
      
      • 运行some_func的第一行,并打印Hello
      • 接下来,some_func尝试断言ab的长度相同。但是,a的长度为3,b的长度为5,因此断言失败。这将导致抛出AssertionError。此时,some_func的执行被终止,并且控制返回到assert_raises
    • assert_raises被告知通过传递给它的第一个参数来期待AssertionError。它看到AssertionError确实被抛出了,所以从它的角度来看一切都很好。它处理AssertionError(防止它创建将显示给您(用户(的错误消息(,并且assert_raises的执行正常结束
  • 接下来你打电话给

    np.testing.assert_array_less(some_func(np.asarray([1, 2, 3]), np.asarray([1, 2, 3])), np.inf)
    
    • 再次运行some_func的第一行并打印Hello
    • 这次是len(a)==len(b)==3,所以assert通过,some_func的执行正常继续
    • 接下来,some_func的第三行运行并打印First assert
    • a中的每个值都是非零的,所以a.all()就是True。布尔值True的数值为1。因此,a.all()<=0.99999False,因此assert失败。此时,AssertionError被提升,并且some_func的执行被终止
  • 这一次,some_func在顶级作用域中运行(如果成功完成,则会调用np.testing.assert_array_less,并将some_func的返回值传递给它(。与上次调用some_func不同,没有任何封闭函数可以处理引发的AssertionError。这意味着AssertionError将传播并产生可见的错误消息,该消息将在First assert下方打印出来

这就是整个故事。

相关内容

  • 没有找到相关文章

最新更新