2011-12-12 36 views
6

我试图用断言表现出一定的不变量(主要是在测试) 因此我想写的东西像下面这样:在Python中的拉姆达检查断言

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)) 

如果我用这个单元测试与.assertEqual这个工作非常好,但是如果我想用断言来写这个,它就会失败。有没有办法来解决这个问题?

回答

8

不幸的是,assert是一个声明和pythons有限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)) 
+0

下面是你可以做的其他事情来实际声明:http://stackoverflow.com/a/40286356/78234 –

8

documentation

注意与拉姆达形式创建的函数不能包括语句。

assert is a statement.

所以,不,你不能在lambda表达式使用assert声明。

+0

其实你可以 - 请参阅http://stackoverflow.com/a/40286356/ 78234 –

+0

不,您没有使用'assert'语句。你通过抛出错误达到类似的效果,但这并不会使我所说的无效。 –

+0

当然,我正在窃听它 - 你不能像你说的那样使用声明。 –

2

其实你可以:

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

下面是一些验证:

try: 
    assertion_raiser() 
except AssertionError: 
    print("assertion caught") 
+1

有趣的是它看起来不太可读。我想我宁愿将一个断言封装到一个函数中,或者写一个我自己的断言函数,它允许我把它放入一个lambda表达式中。 – Alex