sábado, 19 de mayo de 2018

T2. ASSERT. AFIRMACIONES: DIME LA VERDAD.

FLORACIÓN EN LA CABECERA DEL BARRANCO DE CATALANES, SUR DEL MACIZO DE ANAGA, NORESTE DE TENERIFE.

      Hagámonos las siguientes preguntas: imaginemos que hemos definido una función y procedemos a pasarle los argumentos que necesita para ejecutar su código interno y devolvernos un resultado. ¿Cómo se comporta la función si estos argumentos, por el motivo que sea,  no son válidos o están invalidados? ¿Y si resulta que alguna de los algoritmos que contiene la función está mal construido (queríamos efectuar una suma y se nos coló el operador aritmético de multiplicación)  y ejecuta un cálculo erróneo o no deseado?
Pues, si no se lanza ninguna excepción con su acusador y desmoralizante color rojo interrumpiendo la ejecución del código, el programa seguirá corriendo y devolverá un resultado espurio que no será el esperado por el usuario pervirtiendo la funcionalidad del programa. ¡Ay!😞
¿Y por qué no se lanza la excepción? Pues porque no concurre un error de sintaxis que vulnere la gramática de Python para construir expresiones con lo que pasan desapercibidos para el intérprete. Estos "fallos" los generamos nosotros mismos en el momento de codificar, por ejemplo, al errar en el tipo de dato que debe almacenar tal o cual variable o, como ya hemos adelantado más arriba, en la construcción de un algoritmo que efectúe un cálculo concreto.
Para solventar esta situación, al margen de aquellas  excepciones creadas por nosotros mismos como programadores, debemos establecer con anterioridad qué condiciones deben tener las expresiones, tanto previas como posteriores que se deben cumplir de modo que, en el caso de que devinieran False (la expresión es booleana) mostrar el error en pantalla.
Aquí es donde entra la sentencia assert, que se ajusta a la siguiente sintaxis:


Como ya sabemos, toda expresión booleana sólo puede devolver dos valores, True o False, como resultado de la evaluación de una condición. Si la expresión_booleana deviene False se lanzará una excepción de tipo AssertionError, y se pasará a leer la expresión_opcional para solventar el error, mostrar un mensaje de advertencia o un error personalizado.
Tengamos en cuenta que, como assert se ocupa de aspectos de programación y no del resultado en sí de la ejecución del mismo, igual que sucede con, por ejemplo, la función type(), ésta sólo tiene sentido para el diseñador/programados.
Veamos un ejemplo:


En este ejemplo, se comprueban todos los argumentos que se pasen con cada llamada a la función (num). A la sentencia assert la acompaña la función all(), que representa la función_booleana, y que acoge todos los valores de un iterable pasando el mismo como argumento de la función sobre el que aplicará la condición para determinar si es True o False. Justo a continuación, separada por la coma pertinente, la expresión_opcional pasada como una cadena, como una string, que será el mensaje que muestre AssertionError en el caso de que éste se produzca: si introdujéramos como argumento de la función xnum un 0, en cualquier posición (y de aquí el loop for/in), la expresión booleana devolverá False, pues el resultado de multiplicar cualquier número por 0 es 0, y se lanzará la excepción pertinente, AssertionError, con la expresión_opcional como texto aclaratorio.
El caso inferior es similar al primero, salvo que en lugar de confirmar la afirmación en el paso de argumentos, lo hace a partir del resultado obtenido.
Veamos otro ejemplo:



Ya hemos dicho que la sentencia assert, como la función type(), no tiene incidencia alguna desde el punto de vista de la ejecución del programa y, tanto una como otra, sólo tienen cabida como depuradores de código en el proceso de codificación. Entonces, ¿qué hacer con ella en un programa ya plenamente testeado, listo y depurado para ser ejecutado "públicamente"? Pues la mejor opción para evitar complicaciones pasa por hacer un backup del programa omitiendo, esta vez, tanto la sentencia assert como la función type() desactivando así todas las notificaciones. Tan sencillo como eso.

BOMBA VOLCÁNICA DE DURO BASALTO NEGRO INCRUSTADA EN UNA COLADA DE LAVA EN LAS LADERAS QUE CIRCUNDAN LA CALDERA DE LA OROTAVA, CENTRO-NORTE DE TENERIFE. AL FONDO, SOBRE EL MAR, SIGNADA CON UN TRAZO DE NUBE BLANCA, LA SILUETA AZUL DE LA ISLA DE LA PALMA.

      

         LAS FUNCIONES all() Y any():

     

      Tanto la función all() como la función any() ejercen funciones simples de control sobre iterables. Además, ambas funciones son complementarias entre sí. Ambas también suelen emplearse con el concurso de herramientas de control de flujo: if all/any(iterable) = = True:

a) all(): Es una función que suele emplearse con los iterables y que devuelve un booleano:
  • True: si TODOS los elementos de un iterable son verdaderos.
  • False: si ALGUNO de los elementos de un iterable es falso.
b) any(): Es una función que suele emplearse con los iterables y que devuelve un booleano:
  • True: si ALGUNO los elementos de un iterable son verdaderos.
  • False: si TODOS de los elementos de un iterable es falso.
Veamos un ejemplo:



EL TEIDE. TENERIFE.