Обработка исключений утверждается для тестирования NumPy в Python - PullRequest
0 голосов
/ 07 декабря 2018

Понимание чьего-либо кода и соблюдение этого:

Существует функция:

 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 assert, а затем сообщение об ошибке и исключение 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 случае код просто останавливается и никакие исключения не генерируются, хотя он вызывается first assert в some_func ()?

А почему во втором не происходит так же, как в первом, и выдается исключение?

1 Ответ

0 голосов
/ 08 декабря 2018

Основываясь на отображаемом сообщении об ошибке, я собираюсь предположить, что фактическое определение вашей функции 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 пытается утверждать, что длины a и b одинаковы.Однако длина 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.99999 - это False, и поэтому assert терпит неудачу.В этот момент AssertionError повышается и выполнение some_func прекращается.
  • На этот раз some_func выполнялось в области верхнего уровня (если оно имелоуспешно завершено, np.testing.assert_array_less был бы вызван, и возвращаемое значение some_func было бы передано ему).В отличие от последнего вызова some_func, нет функции включения, которая будет обрабатывать AssertionError, который был поднят.Это означает, что AssertionError будет распространяться и выводить видимое сообщение об ошибке, которое будет напечатано под First assert.

И это вся история.

...