assertRaises 和 lambda 表达式,Python
assertRaises and lambda expressions, Python
我知道我可以像这样在 Python 单元测试中调用 assertRaises
:
self.assertRaises(ValueError, lambda: my_fxn(bad_arg))
如果我省略 lambda
表达式,my_fxn
在 assertRaises
之前计算,并且 ValueError
在 assertRaises
函数可用之前抛出处理它。
我不确定的是为什么使用lambda
这里修复了未处理的异常问题。我知道 lambda 表达式通常用于将函数作为参数传递给另一个函数(或 return 来自另一个函数的函数),但似乎不需要 lambda
才能传递作为参数的函数。例如,我可以毫不费力地调用 assertEquals
:
assertEquals(my_fxn(arg1), my_result)
那么这里到底发生了什么?好像是用lambda
不知何故"delays"评价了my_fxn
。它是如何工作的?
assertRaises
调用函数,捕获异常,并通过测试。
你可以称它为 assertRaises(ValueError, my_fxn, bad_arg)
,它会用 bad_arg
调用 my_fxn
。
lambda
创建一个可调用表达式,但不调用它。因此,您可以将 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
我知道我可以像这样在 Python 单元测试中调用 assertRaises
:
self.assertRaises(ValueError, lambda: my_fxn(bad_arg))
如果我省略 lambda
表达式,my_fxn
在 assertRaises
之前计算,并且 ValueError
在 assertRaises
函数可用之前抛出处理它。
我不确定的是为什么使用lambda
这里修复了未处理的异常问题。我知道 lambda 表达式通常用于将函数作为参数传递给另一个函数(或 return 来自另一个函数的函数),但似乎不需要 lambda
才能传递作为参数的函数。例如,我可以毫不费力地调用 assertEquals
:
assertEquals(my_fxn(arg1), my_result)
那么这里到底发生了什么?好像是用lambda
不知何故"delays"评价了my_fxn
。它是如何工作的?
assertRaises
调用函数,捕获异常,并通过测试。
你可以称它为 assertRaises(ValueError, my_fxn, bad_arg)
,它会用 bad_arg
调用 my_fxn
。
lambda
创建一个可调用表达式,但不调用它。因此,您可以将 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