assertRaises и лямбда-выражения, Python

-6

Я знаю, что я могу вызвать assertRaises в модульном тесте Python следующим образом:

self.assertRaises(ValueError, lambda: my_fxn(bad_arg))

Если я опускаю lambda выражение, my_fxn оценивается до assertRaises, а ValueError бросается до того, assertRaises функция assertRaises доступна для его обработки.

То, что я не уверен, и что, по моему мнению, существующие ответы на эту тему не помогают объяснить, почему использование lambda здесь устраняет проблему неполученного исключения. Я знаю, что лямбда-выражения часто используются для передачи функции другой функции в качестве аргумента (или возврата функции из другой функции), но не похоже, что lambda требуется для передачи функции в качестве аргумента. Например, я могу вызвать assertEquals как без проблем:

assertEquals(my_fxn(arg1), my_result)

Так что же здесь происходит? Кажется, что использование lambda каким-то образом "задерживает" оценку my_fxn. Как это работает?

спросил(а) 2017-05-30T21:44:00+03:00 3 года, 4 месяца назад
0
59

assertRaises вызывает функцию, assertRaises исключение и передает тесты.

Вы можете называть его assertRaises(ValueError, my_fxn, bad_arg), и он будет вызывать my_fxn с bad_arg.

lambda создает вызываемое выражение, но не вызывает его. Таким образом, вы можете присвоить лямбда имя:

my_name = lambda: my_fxn(bad_arg)

и затем передать его assertRaises (без его вызова):

assertRaises(ValueError, my_name)

assertRaises вызовет его внутри, и сбой будет только в том случае, если функция не вызывает исключения. Например:

def assertRaises(error_type, function):
try:
function()
assertFail()
except error_type:
pass

ответил(а) 2017-05-30T21:55:00+03:00 3 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема