在Python中检查lambda中的断言

14 投票
5 回答
11857 浏览
提问于 2025-04-17 08:13

我正在尝试使用断言来展示一些不变性(主要是在测试中)。所以我想写一些像下面这样的代码:

values = [ range(10) ] 
expected_values = [ range(10) ]

map (lambda x: assert x[0] == x[1] ,zip( [ run_function(i) for i in values ], expected_values))

如果我用unittest.assertEqual来做,这个方法运行得很好,但如果我想用断言来写,它就失败了。有没有办法解决这个问题呢?

5 个回答

7

其实你可以这样做:

assertion_raiser = lambda: (_ for _ in ()).throw(AssertionError("My Lambda CAN raise an assertion!"))

这里有一些验证的代码:

try:
    assertion_raiser()
except AssertionError:
    print("assertion caught")
13

来自文档

请注意,用lambda形式创建的函数不能包含语句。

assert是一个语句。

所以,不,你不能在lambda表达式中使用assert语句。

12

很遗憾,assert 是一种语句,而Python的lambda表达式功能有限,不允许在里面使用这种语句。它们也限制了一些其他的功能,比如print

不过,你可以在这里使用生成器表达式。

assert all(x[0] == x[1] for x in  zip( [run_function(i) for i in values ], expected_values))

我个人觉得下面的写法会更容易理解。

assert all(run_function(i) == j for i,j in zip(inputs, expected_values))

撰写回答