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__
yAssertionError
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.