Depuración eficaz con la declaración de afirmación de Python

¿Eres un programador? Si es así, la depuración es una habilidad esencial, independientemente del lenguaje en el que esté codificando. En este artículo, aprenderá cómo usar la declaración de afirmación en Python para una depuración efectiva.

Cuando esté trabajando en un proyecto, definirá varios módulos. Esto incluye funciones, definiciones de clase y más. Y es probable que encuentre errores o resultados inesperados debido a un error en la implementación. Las declaraciones de afirmación son útiles para depurar dicho código.

En este tutorial, aprenderemos la sintaxis para usar la declaración de afirmación seguida de ejemplos de código para verla en acción. También veremos qué son los errores de aserción y cómo podemos usarlos para corregir los errores en el código durante el desarrollo.

¡Vamos a empezar!

Cómo usar la declaración de afirmación en Python

Aprenderemos la sintaxis para usar la declaración de afirmación, luego procederemos a codificar algunos ejemplos.

Sintaxis de la declaración de afirmación

Comencemos con la sintaxis para usar la declaración de afirmación en Python:

assert expression, message

Aquí,

  • expresión es cualquier expresión de Python válida para ser evaluada. Esto puede ser una condición sobre el valor de la variable, el valor de verdad de la variable, el valor de retorno de una función y más.
  • Siempre que la expresión se evalúe como True, la declaración de afirmación no genera un error ni devuelve nada. Esto indica que el programa funciona como se esperaba.
  • Si la expresión ya no es True, se genera una excepción AssertionError.
  • El mensaje es una cadena opcional. Puede especificar un mensaje que se muestre en el seguimiento cada vez que se genere una excepción AssertionError.

A continuación, procedamos a codificar algunos ejemplos en los que la declaración de afirmación puede ayudarnos a escribir un código más limpio y sin errores.

Puede encontrar los ejemplos de código usados ​​en este tutorial en esta esencia de GitHub.

Ejemplos de declaración de afirmación de Python

Considere el siguiente ejemplo. Digamos que tiene una variable de descuento en su código. Pero le gustaría que su valor sea siempre menor o igual que max_discount.

Para verificar que accidentalmente no establece la variable de descuento en un valor, puede agregar una afirmación. La expresión a evaluar es: descuento <= max_descuento.

>>> max_discount = 50
>>> discount = 20
>>> assert discount <= max_discount

Aquí, descuento (20) es menor que max_discount (50). Entonces, la declaración de afirmación no arroja ningún error.

La excepción AssertionError

Si la variable de descuento se establece en un valor mayor que max_discount, se genera una excepción AssertionError.

>>> discount = 75
>>> assert discount <= max_discount
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

Sabemos que la declaración de afirmación también nos permite especificar una cadena de mensaje opcional.

También usemos una cadena de mensaje que brinde una información de diagnóstico más descriptiva. A la declaración de afirmación, agreguemos una cadena f de Python que también contiene los valores de descuento y descuento máximo.

>>> assert discount <= max_discount, f"discount should be at most {max_discount}; got discount = {discount}"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: discount should be at most 50; got discount = 75

Como se ve en la celda de salida anterior, la excepción AssertionError ahora incluye los valores de las variables discount y max_discount.

Depuración y prueba de funciones de Python con Assert

Al definir funciones, a veces puede introducir errores (errores lógicos) sin darse cuenta que evitarán que su función funcione según lo previsto.

Tomemos un ejemplo. Supongamos que hay una prueba en una clase y los estudiantes tienen la oportunidad de intentar una pregunta extra. Cualquier estudiante que intente responder la pregunta adicional obtendrá 10 puntos adicionales en la prueba. 😄

Considere la siguiente función get_final_score:

  • Admite una puntuación actual, una puntuación y una bonificación booleana.
  • Si un estudiante ha respondido la pregunta de bonificación, la bonificación booleana es verdadera y obtiene 10 puntos más que su puntaje actual.
  • A continuación, la función devuelve la puntuación final.
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

Hagamos algunas llamadas a la función. Vemos que para puntajes de 34 y 40 con bonificación establecida en Verdadero y Falso, los puntajes finales son 44 y 40, respectivamente.

print(get_final_score(34,True))
# 44
print(get_final_score(40,False))
# 40

Sin embargo, el máximo de puntos en la prueba es, digamos, 50. Entonces, si un estudiante obtiene 49 y también respondió la pregunta de bonificación, la función get_final_score felizmente calculará que el puntaje final es 59.

print(get_final_score(49,True))
# 59

Técnicamente, es posible. Pero supongamos que un estudiante no puede obtener más que los puntos máximos posibles para la prueba. 🙂

Entonces, inicialicemos una variable max_score. Y capture la puntuación devuelta por la función en la variable final_score.

Posteriormente, agregamos una afirmación que verifica si final_score es menor que max_score.

def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

final_score = get_final_score(47,True)
max_score = 50

assert final_score <= max_score

Ahora obtenemos una excepción AssertionError para la llamada de función get_final_score(47,True):

Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score
AssertionError

Ahora agregamos una cadena f descriptiva a la declaración de afirmación de Python:

assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
AssertionError: final_score should be at most 50; got 57

Modificando la función

Volvamos atrás y modifiquemos la definición de la función get_final_score para corregir el comportamiento inesperado:

  • La función get_final_score también toma max_score como parámetro.
  • Verificamos si el bono es Verdadero. Si es Verdadero, sumamos 10 puntos a la variable puntuación.
  • Luego, verificamos si el puntaje es mayor que max_score. Si es así, devolvemos max_score.
  • De lo contrario, devolvemos la puntuación.

Ahora nos hemos asegurado de que la puntuación final sea siempre menor o igual que max_score.

def get_final_score(score,bonus,max_score):
    if bonus:
        score += 10
    if score > max_score:
        return max_score
    return score

Como ejercicio rápido, escriba algunas afirmaciones para confirmar que la función ahora funciona como se esperaba.

Una nota sobre la excepción AssertionError

Aunque se produce una excepción AssertionError cuando la expresión se evalúa como Falsa, debemos recordar que no se deben manejar tales errores como excepciones. Lo que significa que no deberíamos hacer algo como esto:

try:
    <doing this>
except AssertionError:
    <do this>

En el ejemplo anterior sobre get_final_score, usamos la aserción para verificar si final_score es menor que max_score. Luego modificamos la definición de la función para que no haya errores de aserción.

Para eso están las afirmaciones. Son controles de cordura para el código y ayudan a escribir un código más limpio. El manejo de excepciones, por otro lado, es anticipar y manejar errores inesperados en tiempo de ejecución. Estos a menudo incluyen tipos y valores de entrada no válidos.

En resumen, debe usar la declaración de aserción de Python para una depuración efectiva y no manejar AssertionErrors como excepciones.

Conclusión

Este tutorial lo ayudó a comprender cómo usar la declaración de afirmación en Python. Aquí tienes un resumen de lo que has aprendido:

  • Las declaraciones de afirmación de Python (aserciones) toman la forma de expresión de afirmación. Esto comprueba si la expresión es verdadera. Si no se evalúa como True, se genera una excepción AssertionError.
  • También puede usar la afirmación con la expresión de afirmación de sintaxis, mensaje. Esto imprimirá la cadena del mensaje cada vez que ocurra una excepción AssertionError.
  • Debe recordar no implementar el manejo de excepciones para manejar errores de aserción. Y utilice las aserciones como una útil herramienta de depuración para las comprobaciones de cordura de su código.

Como desarrollador, las aserciones lo ayudan con la depuración. Para asegurarse de que todos los componentes individuales (módulos) del proyecto funcionen como se espera, puede aprender a escribir pruebas unitarias en Python.

A continuación, consulte esta lista de proyectos Python para principiantes en los que puede trabajar.