2011-12-12 7 views
6

que estoy tratando de utilizar afirmaciones para mostrar algunos invariantes (sobre todo en las pruebas) Así que quiero escribir algo como lo siguiente:afirmaciones de cheques en una lambda en 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)) 

Si uso esto con unittest .assertEqual esto funciona perfectamente bien, pero si quiero escribir esto con una afirmación simplemente falla. ¿Hay alguna manera de arreglar esto?

Respuesta

8

Desafortunadamente, assert es una afirmación y las lambdas limitadas de Pythons no permiten eso en ellas. También restringen cosas como print.

Aunque aquí puede usar una expresión de generador.

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

Personalmente, creo que la siguiente sería más legible

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

Aquí hay algo más que puede hacer para afirmar realmente: http://stackoverflow.com/a/40286356/78234 –

8

Desde el documentation:

Tenga en cuenta que las funciones creadas con las formas lambda no pueden contener declaraciones.

assert is a statement.

Así que no, no se puede utilizar la instrucción assert en una expresión lambda.

+0

En realidad se puede - ver http://stackoverflow.com/a/40286356/ 78234 –

+0

No, no está usando la declaración 'assert'. Está logrando un efecto similar arrojando el error, pero eso no invalida lo que dije. –

+0

Por supuesto que lo estoy pirateando; no puedes usar una declaración, como dijiste. –

2

En realidad, usted puede:

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

Aquí es un poco de validación:

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

Interesante, aunque no parece muy legible. Creo que prefiero incluir una afirmación en una función o escribir mi propia función afirmar que me permite ponerla en una lambda. – Alex