2011-12-12 40 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