【发布时间】:2017-05-30 18:44:13
【问题描述】:
我知道我可以像这样在 Python 单元测试中调用 assertRaises:
self.assertRaises(ValueError, lambda: my_fxn(bad_arg))
如果我省略lambda 表达式,my_fxn 在assertRaises 之前被评估,ValueError 在assertRaises 函数可用于处理它之前被抛出。
我不确定,并且我认为关于这个主题的现有答案不能很好地解释,为什么在这里使用lambda 修复了无人问津的问题异常问题。我知道 lambda 表达式通常用于将函数作为参数传递给另一个函数(或从另一个函数返回一个函数),但似乎不需要 lambda 才能将函数作为参数传递.例如,我可以像这样毫无问题地拨打assertEquals:
assertEquals(my_fxn(arg1), my_result)
那么这里到底发生了什么?似乎lambda 的使用以某种方式“延迟”了my_fxn 的评估。它是如何工作的?
【问题讨论】:
-
是的,完全正确。
assertRaises中有一个try/except来阻止异常转义。 -
一个 lambda 表达式定义了一个函数。在函数执行之前,函数中的代码不会运行。这就是函数。
-
@khelwood 我意识到这一点。我的问题的另一部分是为什么我可以使用
assertEquals(my_fxn(arg1), my_result)(没有 lambda)而不是self.assertRaises(ValueError, lambda: my_fxn(bad_arg))。 -
因为
assertRaises无法捕获在它之外发生的异常。 -
对,这是有道理的。但是在
assertEquals的情况下,调用my_fxn并将返回值传递给assertEquals是可以的。在这种情况下,我们对函数返回的内容感兴趣,而不是它的执行是否被异常中断,我们可以在assertEquals执行之前调用my_fxn。
标签: python lambda python-unittest