with tutorial the para latest framework español desde cero applications python exception assertions nose

python - tutorial - the django project



¿Cómo cambiar el mensaje en Python AssertionError? (5)

Escribo de la siguiente manera, en la cual trato de producir un mensaje de error decente cuando comparo dos bloques multilínea de texto Unicode. El método interior que hace la comparación plantea una afirmación, pero la explicación predeterminada es inútil para mí

Necesito agregar algo al código como este a continuación:

def assert_long_strings_equal(one, other): lines_one = one.splitlines() lines_other = other.splitlines() for line1, line2 in zip(lines_one, lines_other): try: my_assert_equal(line1, line2) except AssertionError, error: # Add some information to the printed result of error??! raise

No puedo entender cómo cambiar el mensaje de error impreso en el assertionerror que atrapo. Siempre obtengo AssertionError: u''something'' != ''something else'' , que solo muestra la primera línea de la salida.

¿Cómo puedo cambiar el mensaje de afirmación para imprimir lo que quiera?

Si es relevante, estoy usando la nose para ejecutar la prueba.


Con este método, pude editar el mensaje y aún tener el rastro de la pila (+ cualquier otra información) visible. Además, las nuevas líneas se muestran a la derecha.

try: my_assert_equal(line1, line2) except AssertionError as e: message = e.args[0] message += "/nThis appends the default message and can have newlines" e.args = (message,) #wrap it up in new tuple raise


Desea tomar la excepción detectada, conviértala en una cadena, combínela con alguna información de cadena adicional y genere una nueva excepción.

x = 3 y = 5 try: assert( x == y ) except AssertionError, e: raise( AssertionError( "Additional info. %s"%e ) )


Puede pasar el mensaje deseado al crear la excepción.

raise AssertionError(line1 + '' != '' + line2)

Espero que esto ayude.


Use e.args , e.message está en desuso.

try: assert False, "Hello!" except AssertionError as e: e.args += (''some other'', ''important'', ''information'', 42) raise

Esto conserva el rastreo original. Su última parte se ve así:

AssertionError: (''Hello!'', ''some other'', ''important'', ''information'', 42)

Funciona tanto en Python 2.7 como en Python 3.


assert expression, info

Por ejemplo,

>>> assert False, "Oopsie" Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError: Oopsie

De los docs :

Las declaraciones de confirmación son una forma conveniente de insertar las aserciones de depuración en un programa:

assert_stmt ::= "assert" expression ["," expression]

La forma simple, assert expression , es equivalente a

if __debug__: if not expression: raise AssertionError

La forma extendida

assert expression1, expression2

es equivalente a

if __debug__: if not expression1: raise AssertionError(expression2)

Estas equivalencias suponen que __debug__ y AssertionError referencia a las variables incorporadas con esos nombres. En la implementación actual, la variable __debug__ es True en circunstancias normales, False cuando se solicita la optimización (opción de línea de comando -O). El generador de código actual no emite código para una declaración de aserción cuando se solicita la optimización en tiempo de compilación. Tenga en cuenta que no es necesario incluir el código fuente para la expresión que falló en el mensaje de error; se mostrará como parte del seguimiento de la pila.