From 4bc883ee2a2ff65dae61a263cca63bdfa8043fa5 Mon Sep 17 00:00:00 2001 From: Manuel Vergara Date: Fri, 19 May 2023 22:00:38 +0200 Subject: [PATCH] Update README day 8 Signed-off-by: Manuel Vergara --- dia_08/README.md | 180 +++++++++++++++++++++++++++++++++++++++++++++++ img/dia08_01.png | Bin 0 -> 22566 bytes img/dia08_02.png | Bin 0 -> 10775 bytes 3 files changed, 180 insertions(+) create mode 100644 img/dia08_01.png create mode 100644 img/dia08_02.png diff --git a/dia_08/README.md b/dia_08/README.md index 5d313d8..90bc555 100644 --- a/dia_08/README.md +++ b/dia_08/README.md @@ -15,20 +15,200 @@ ## 8.1. - Instalar paquetes +Una de las grandes ventajas de Python como lenguaje de programación, es que cuenta con un amplia comunidad activa, que desarrolla paquetes que añaden muchas más funcionalidades. + +PyPi (Python Package Index) es el repositorio de referencia para hallar paquetes desarrollados por la comunidad. https://pypi.org/ + +Si ya conoces el nombre del módulo que quieres instalar, puedes obtenerlo de PyPi directamente desde la consola: +```shell +pip install +``` + +También podrás actualizar los módulos que ya tengas instalados añadiendo --upgrade luego del nombre del paquete: +```shell +pip install --upgrade +``` + +No dejes de utilizar Google para investigar nuevos paquetes y sus funcionalidades. + ## 8.2. - Módulos y paquetes +Los módulos no son más que archivos .py, que almacenan funciones, variables y clases, y pueden ser importado por otros. Los paquetes agrupan estos módulos en carpetas, de los cuales uno debe ser `__init__.py` + +Importar un módulo: +```python +import modulo1 +``` + +Importar una función del módulo: +```python +from modulo1 import funcion +``` + +Ejecutar desde la consola +```shell +C:\... ruta> python modulo1.py +``` + +Importar un módulo de un (sub) paquete +```python +from paquete.subpaquete import modulo3 + ``` + +Todos los paquetes, para ser considerados como tales, deben contar con un archivo __init__.py (constructor) + +![](../img/dia08_01.png) + ## 8.3. - Manejo de errores +Existen estrategias para capturar y gestionar los errores que pueden presentarse al ejecutar un programa, a fines de evitar una falla mayor y controlar la información que es mostrada al usuario. +```python +try: +``` + +El código que se encuentra dentro de try se ejecuta hasta finalizar o hasta que se presenta un error (excepción) +```python +except: +``` + +Contiene el manejador de errores (respuesta del programa ante un error), atrapando las excepciones que se presentan durante la ejecución de try* +```python +else: +``` + +Engloba el código que se ejecutará únicamente cuando ninguna excepción haya sido detectada en la ejecución de try (sin errores) +```python +finally: +``` + +Contiene código que se ejecuta siempre, se hayan presentado o no errores. * + +![](../img/dia08_01.png) + +Es buena práctica capturar y manejar las excepciones posibles individualmente y brindar información acerca del error y su possible solución. +```python +except ValueError: +except TypeError: +except FileNotFoundError: +... +``` + +Documentación python de errores: https://docs.python.org/es/3/library/exceptions.html ## 8.4. - pylint +Pylint es un verificador de código, errores y calidad para Python, siguiendo el estilo recomendado por PEP 8, la guía de estilo de Python. Es de gran utilidad en el trabajo en equipo. +```shell +pip install pylint +``` + +Ejecutar desde la consola: +```shell + ruta> pylint modulo1.py -r y +``` +archivo de Python a evaluar + +Al ejecutarse, Pylint devuelve un reporte con las características que fueron evaluadas, errores y puntuaciones parciales +```shell +Your code has been rated at 6.67/10 +``` + +A mayor puntaje, mayor será la calidad de tu código. Un umbral aceptable será >= 7.00/10 + ## 8.5. - unittest +Unit Testing es un método o herramienta utilizado en programación para determinar si un módulo o un conjunto de módulos de código funciona correctamente. Dicha evaluación se realiza en un archivo independiente. En Python, se implementa desde el módulo incorporado unittest. +```python +import unittest +import mimodulo + +class NombrePrueba(unittest.TestCase): + + def test_prueba(self): + primer_valor = {algo} + segundo_valor = {salida de mimodulo.funcion} + self.assertEqual(primer_valor, segundo_valor, mensaje) + +if __name__ == '__main__': + unittest.main() +``` + +Los primeros dos argumentos de assertEqual son dos valores que se comparan para establecer si hay igualdad entre ellos. Por eso, uno debe obtenerse a partir de una función del módulo evaluado, y otro ser la salida esperada para una misma entrada de información que en el primer caso. El tercer parámetro (mensaje), contendrá un string con información que se mostrará al usuario en caso de que el test falle. + +Antes incluso de ejecutar el código, Python lee el archivo para definir algunas variables globales. Una de ellas es `__name__`, que toma el nombre "`__main__`" en caso que Python esté corriendo en dicho módulo de manera individual. Si por el contrario, el módulo fuera importado, la variable `__name__` toma el nombre del módulo. Este bloque de código evalúa que la prueba se esté ejecutando directamente. + ## 8.6. - Decoradores +Los decoradores son patrones de diseño en Python utilizados para dar nueva funcionalidad a objetos (funciones), modificando su comportamiento sin alterar su estructura: **son funciones que modifican funciones**. + +Las funciones en Python soportan operaciones tales como ser asignadas a una variable, pasadas como argumento, y ser devueltas por otra función como resultado. + +También, es posible definir funciones dentro de funciones, sin que estén disponibles fuera de la función dentro de la cual fueron definidas. + +Los decoradores permiten que una función se modifique ante determinados escenarios, sin duplicar código. +```python +def mostrar_informacion(funcion): > Función como parámetro de una función + + def interior(): > Definición de una función dentro de otra + print(f'Ejecutando la función {funcion.__name__}') + funcion() + print('Ejecución finalizada') + + return interior > Función que devuelve otra función como resultado + +def impresion(): + print("Hola Mundo") + +funcion_decorada = mostrar_informacion(impresion) # Se asigna una función a una variable + +funcion_decorada() # Ejecución de función decorada +``` + + Ejecutando la función impresion + Hola Mundo + Ejecución finalizada> Funcionalidad extendida + ## 8.7. - Generadores +Los generadores son tipos especiales de funciones que devuelven un iterador que no almacena su contenido completo en memoria, sino que "demora" la ejecución de una expresión hasta que su valor se solicita. +```python +def secuencia_infinita(): + + num = 0 + while True: + + yield num + + num += 1 +``` + +Dado que un ordenador no cuenta con memoria infinita, no podría generarse una secuencia de números sin límite sin la ayuda de un generador. + +Lo mismo ocurre con datos que, sin ser infinitos, ocuparían demasiado espacio en memoria de almacenarse repentinamente. +```python +generador = secuencia_infinita() +print(next(generador)) +print(next(generador)) +print(next(generador)) +``` + + 0 + 1 + 2 + ## 8.8. - Proyecto del Día 8 +El desafío de hoy, es que crees un software que funcione como el turnero de una farmacia. + +En nuestro caso, vas a crear el tunero para una farmacia que tiene tres áreas de atención: perfumería, farmacia (que es donde venden los medicamentos), y cosméticos. Tu programa le tiene que preguntar al cliente a cuál de las áreas desea dirigirse, y le va a dar un número de turno según a qué área se dirija. Por ejemplo, si elige cosmética le va a dar el número C-54 (“C” de cosmética). Luego de eso, nos va a preguntar si queremos sacar otro turno. Esto, en realidad, es para simular si viene un nuevo cliente. Y repetirá todo el proceso. + +Algunas cosas a tener en cuenta: + +Los diferentes clientes van a ir sacando turnos para diferentes áreas (perfumería, farmacia, cosmética), en diferentes órdenes, por lo que el sistema debe llevar la cuenta de cuántos turnos ha dado para cada una de esas áreas, y producir el siguiente número de cada área a medida que se lo pida. ¿No te parece genial aprovechar la eficiencia de los generadores para poder hacer esto? + +Por otro lado, el mensaje donde le comunicamos el número de espera al cliente, debería tener algo de texto adicional antes y después del número. Por ejemplo, “su turno es (-el número de turno con el del comienzo-)”, y luego algo así como “aguarde y será atendido”. Para que nuestro código no se repita, en vez de poner ese texto en cada una de las funciones que calculen los números, podemos aprovechar la flexibilidad de los decoradores para crear ese texto adicional una sola vez, y luego envolver a cualquiera de nuestras funciones con ese texto único. + +Finalmente, deberías aprovechar que ahora ya sabes dividir tu programa en diferentes módulos, y entonces separar el código en dos partes: por un lado, un módulo que se puede llamar **números.py**, en el que vas a escribir todos los generadores y el decorador, y un segundo módulo que podemos llamar **principal.py**, donde vas a escribir las funciones que administran el funcionamiento del programa (como las instrucciones para elegir un área y para decidir si seguirá tomando nuevos turnos o si va a finalizar el programa). Recuerda que vas a necesitar importar el contenido de numeros.py dentro de principal.py para poder disponer de sus funciones. + ## Ficheros y documentación - [01_pruebas_modulos](01_pruebas_modulos/) - [02_pruebas_paquete](02_pruebas_paquete/) diff --git a/img/dia08_01.png b/img/dia08_01.png new file mode 100644 index 0000000000000000000000000000000000000000..d7ade59f764fb2def03a112e01889e60621b02d2 GIT binary patch literal 22566 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 NZfP0Z%)en3{6C5O@e2R| literal 0 HcmV?d00001 diff --git a/img/dia08_02.png b/img/dia08_02.png new file mode 100644 index 0000000000000000000000000000000000000000..7a615f3f43e66e314ddcf8014e8a343e6ea741cf GIT binary patch literal 10775 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 GiufPz%Av>r literal 0 HcmV?d00001