2011-12-12 18 views
6

che sto cercando di utilizzare le asserzioni di mostrare alcune invarianti (per lo più in fase di test) Così voglio scrivere qualcosa di simile a quanto segue:controllo affermazioni in un lambda in 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)) 

Se io uso questo con unittest .assertEqual funziona perfettamente, ma se voglio scrivere questo con un'affermazione, fallisce. C'è un modo per risolvere questo problema?

risposta

8

Sfortunatamente, assert è una dichiarazione e Python limitato lambda non consentono che in loro. Limitano anche cose come print.

Qui puoi usare un'espressione di generatore.

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

Personalmente ritengo che il seguente sarebbe più leggibile

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

Ecco qualcos'altro che puoi fare per affermare effettivamente: http://stackoverflow.com/a/40286356/78234 –

8

Dal documentation:

Si noti che le funzioni create con forme lambda non possono contenere dichiarazioni.

assert is a statement.

Quindi no, non è possibile utilizzare l'istruzione assert in un'espressione lambda.

+0

In realtà è possibile - vedi http://stackoverflow.com/a/40286356/ 78234 –

+0

No, non stai usando l'istruzione 'assert'. Stai ottenendo un effetto simile lanciando l'errore, ma ciò non invalida ciò che ho detto. –

+0

Certo che lo sto hackerando - non puoi usare una dichiarazione, come hai detto tu. –

2

In realtà è possibile:

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

Ecco alcune convalida:

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

Interessante, tuttavia, non sembra molto leggibile. Immagino che preferirei inserire un'asserzione in una funzione o scrivere la mia funzione di asserzione che mi permette di inserirla in una lambda. – Alex