15. Módulos

Introducción

A medida que los programas crezcan, quizás querramos separarlo en varios archivos para que el mantenimiento sea más sencillo.

Quizás también querramos usar una función útil ya escrita en otros programas sin copiar su definición en cada programa.

Para soportar esto, Python tiene una manera de poner definiciones en un archivo y usarlos en un script o en una instancia del intérprete.

Este tipo de ficheros se llama módulo; las definiciones de un módulo pueden ser importadas a otros módulos o al módulo principal.

Definición

Un módulo en Python es un fichero que alberga un conjunto de funciones, variables o clases y que puede ser usado por otros módulos.

Un módulo es un fichero conteniendo definiciones y declaraciones de Python. El nombre de archivo es el nombre del módulo con el sufijo .py agregado.

Más sobre módulos

  • Un módulo puede contener tanto declaraciones ejecutables como definiciones de funciones. Estas declaraciones están pensadas para inicializar el módulo. Se ejecutan únicamente la primera vez que el módulo se encuentra en una declaración import.

  • Cada módulo tiene su propio espacio de nombres privado, que es utilizado como espacio de nombres global por todas las funciones definidas en el módulo. De este modo, el autor de un módulo puede utilizar variables globales en el módulo sin preocuparse por choques accidentales con las variables globales de un usuario.

  • Los módulos pueden importar otros módulos. Es costumbre pero no obligatorio ubicar todas las declaraciones import al principio del módulo (o script, para el caso).

  • Python, por defecto, viene con módulos ya incorporados. Aquí podemos acceder a una lista de estos módulos: https://docs.python.org/3/py-modindex.html

Importación completa de módulos (import)

  • import Modulo : Ejecuta el código que contiene Modulo y crea una referencia a él, de manera que pueden invocarse un objeto o función func definida en él mediante la sintaxis Modulo.func

  • import Modulo as N : Ejecuta el código que contiene Modulo y crea una referencia a él con el nombre N, de manera que pueden invocarse un objeto o función func definida en él mediante la sintaxis N.func. Esta forma es similar a la anterior, pero se suele usar cuando el nombre del módulo es muy largo para utilizar un alias más corto.

Importación parcial de módulos (from import)

  • from Modulo import func, otrafunc, ... : Ejecuta el código que contiene Modulo y crea referencias a los objetos func, otrafunc, ..., de manera que pueden ser invocados por su nombre. De esta manera para invocar cualquiera de estos objetos no hace falta precederlos por el nombre del módulo, basta con escribir su nombre.

  • from Modulo import * : Ejecuta el código que contiene Modulo y crea referencias a todos los objetos públicos (aquellos que no empiezan por el carácter _) definidos en el módulo, de manera que pueden ser invocados por su nombre.

Cuando se importen módulos de esta manera hay que tener cuidado de que no haya coincidencias en los nombres de funciones, variables u otros objetos.

Ejemplo de Módulo

import math
print(math.log(10))

Escribiendo nuestro propio módulo

%%writefile mimodulo.py
# mimodulo.py
def suma(a, b):
    return a + b

def resta(a, b):
    print("hola es la resta")
    return a - b

Una vez definido, dicho módulo puede ser importado en otro fichero.

Usando import podemos importar todo el contenido.

import mimodulo

print(mimodulo.suma(4, 6))
print(mimodulo.resta(10, 9))

También podemos importar únicamente los componentes que nos interesen como mostramos a continuación.

from mimodulo import suma
a=5
b=7
print(suma(a,b))

Por último, podemos importar todo el módulo haciendo uso de * , sin necesidad de usar mimodulo.

from mimodulo import *
a=int(input("ingrese un número: "))
b=int(input("ingrese un número: "))
print("la suma es: ", suma(a, b))
print("la resta es: ",resta(a, b))

Módulos Estándar

Python nos provee de un gran abanico de módulos que integran su librería estándar, como bien puede verse en el manual oficial https://docs.python.org/3/library/index.html.

Por mencionar algunos:
- **os** proporciona una forma portátil de usar la funcionalidad dependiente del sistema operativo
- **math** proporciona acceso a las funciones matemáticas definidas por el estándar C.
- **statistics** proporciona funciones para calcular estadísticas matemáticas de datos numéricos
- **datetime** proporciona clases para manipular fechas y horas
- **sys** brinda acceso a algunas variables utilizadas o mantenidas por el intérprete y a funciones que interactúan fuertemente con el intérprete
- varias para Manejo de Internet.

Además de la biblioteca estándar, hay una colección activa de cientos de miles de componentes (desde programas y módulos individuales hasta paquetes y marcos de desarrollo de aplicaciones completos), disponibles en el Índice de paquetes de Python https://pypi.org/.

Algunos de ellos son:
- NumPy es el paquete fundamental para la computación científica en Python. Es una biblioteca de Python que proporciona un objeto de matriz multidimensional, varios objetos derivados (como matrices y matrices enmascaradas) y una variedad de rutinas para operaciones rápidas en matrices, que incluyen manipulación matemática, lógica, de formas, clasificación, selección, E/S. , transformadas discretas de Fourier, álgebra lineal básica, operaciones estadísticas básicas, simulación aleatoria y mucho más.
- Matplotlib es una biblioteca completa para crear visualizaciones estáticas, animadas e interactivas en Python.
- Panda es una herramienta de análisis y manipulación de datos de código abierto rápida, potente, flexible y fácil de usar, construido sobre el lenguaje de programación Python.

PRACTICA

Crear un módulo que contenga dos funciones: una para validar nombres de usuario y otra para validar contraseña.

Ejercicio 1. Crear una función para validación de nombres de usuarios. Dicho módulo, deberá cumplir con los siguientes criterios de aceptación:

  • El nombre de usuario debe contener un mínimo de 6 caracteres y un máximo de 12.
  • El nombre de usuario debe ser alfanumérico.
  • Nombre de usuario con menos de 6 caracteres, retorna el mensaje "El nombre de usuario debe contener al menos 6 caracteres".
  • Nombre de usuario con más de 12 caracteres, retorna el mensaje "El nombre de usuario no puede contener más de 12 caracteres".
  • Nombre de usuario con caracteres distintos a los alfanuméricos, retorna el mensaje "El nombre de usuario puede contener solo letras y números". Nombre de usuario válido, retorna True.

Ejercicio 2. Crear una función para validación de contraseñas. Dicho módulo, deberá cumplir con los siguientes criterios de aceptación:

  • La contraseña debe contener un mínimo de 8 caracteres.
  • Una contraseña debe contener letras minúsculas, mayúsculas, números y al menos 1 carácter no alfanumérico.
  • La contraseña no puede contener espacios en blanco. Contraseña válida, retorna True.
  • Contraseña no válida, retorna el mensaje "La contraseña elegida no es segura".

Ejercicio 3. Crear un programa que utilice el módulo creado. El programa debe solicitar al usuario el ingreso de un nombre de usuario y contraseña y que los valide utilizando las funciones generadas en los dos ejercicios anteriores.