Bueno, esta es una pregunta abierta, y tengo dos aspectos que quiero tocar: cuándo agregar aserciones y cómo escribir los mensajes de error.
Propósito
Para explicárselo a un principiante, las aserciones son declaraciones que pueden generar errores, pero no las detectará. Y normalmente no se deben criar, pero en la vida real a veces se crían de todos modos. Y esta es una situación grave, de la cual el código no puede recuperarse, lo que llamamos un "error fatal".
A continuación, es para 'propósitos de depuración', lo que, aunque es correcto, suena muy desdeñoso. Me gusta más la formulación de 'declarar invariantes, que nunca deberían violarse', aunque funciona de manera diferente en diferentes principiantes ... Algunos 'simplemente lo entienden', y otros no encuentran ningún uso para él o reemplazan las excepciones normales, o incluso controlar el flujo con él.
Estilo
¡En Python, assert
es una declaración, no una función! (recuerdaassert(False, 'is true')
que no subirá. Pero, teniendo eso fuera del camino:
¿Cuándo y cómo escribir el 'mensaje de error' opcional?
Esto se aplica realmente a los marcos de prueba de unidad, que a menudo tienen muchos métodos dedicados para hacer afirmaciones ( assertTrue(condition)
, assertFalse(condition), assertEqual(actual, expected)
etc.). A menudo también proporcionan una forma de comentar sobre la afirmación.
En el código desechable, podría prescindir de los mensajes de error.
En algunos casos, no hay nada que agregar a la afirmación:
volcado de def (algo): afirmar isinstance (algo, Dumpable) # ...
Pero aparte de eso, un mensaje es útil para la comunicación con otros programadores (que a veces son usuarios interactivos de su código, por ejemplo, en Ipython / Jupyter, etc.).
Bríndeles información, no solo filtrar detalles de implementación internos.
en vez de:
assert meaningless_identifier <= MAGIC_NUMBER_XXX, 'meaningless_identifier is greater than MAGIC_NUMBER_XXX!!!'
escribir:
assert meaningless_identifier > MAGIC_NUMBER_XXX, 'reactor temperature above critical threshold'
o tal vez incluso:
assert meaningless_identifier > MAGIC_NUMBER_XXX, f'reactor temperature({meaningless_identifier }) above critical threshold ({MAGIC_NUMBER_XXX})'
Lo sé, lo sé, este no es un caso para una aserción estática, pero quiero señalar el valor informativo del mensaje.
¿Mensaje negativo o positivo?
Esto puede ser controvertido, pero me duele leer cosas como:
assert a == b, 'a is not equal to b'
Estas son dos cosas contradictorias escritas una al lado de la otra. Entonces, cada vez que tengo una influencia en la base de código, presiono para especificar lo que queremos, usando verbos adicionales como 'must' y 'should', y no decir lo que no queremos.
afirmar a == b, 'a debe ser igual a b'
Entonces, obtener AssertionError: a must be equal to b
también es legible, y la declaración parece lógica en el código. Además, puede obtener algo sin leer el rastreo (que a veces ni siquiera puede estar disponible).