【问题标题】:assertRaises and lambda expressions, PythonassertRaises 和 lambda 表达式,Python
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-04-10
    • 2016-03-19
    • 2016-07-30
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多