Saltar al contenido
Portada » Lenguajes » 8. Módulos y Paquetes

8. Módulos y Paquetes

Módulos y Paquetes. En este capítulo nos adentraremos en el manejo de módulos y paquetes en Python, una herramienta clave para organizar el código y ampliar las capacidades de nuestros programas. Los módulos y paquetes permiten separar funcionalidades en diferentes archivos, facilitando la lectura, reutilización y colaboración en proyectos más grandes.

Empezaremos con el concepto de módulo, que en Python es simplemente un archivo que contiene código, funciones y variables que se pueden importar en otros programas. Veremos cómo importar módulos estándar con import y from ... import para acceder a bibliotecas integradas como pueden ser math para cálculos matemáticos, datetime para manejo de fechas y horas, os para interactuar con el sistema operativo, etc.

Posteriormente, exploraremos cómo crear nuestros propios módulos y organizar proyectos más complejos utilizando paquetes, que son carpetas que contienen múltiples módulos. Aprenderemos a estructurar el código para crear aplicaciones escalables y reutilizables.

Por último, nos familiarizaremos con pip, el administrador de paquetes de Python. Este nos permite instalar paquetes externos de otros desarrolladores, ampliando así nuestras capacidades aprovechando el trabajo ya desarrollado por terceros que ponen a disposición de la comunidad. Ejemplos de estos paquetes pueden ser requests para manejar solicitudes HTTP o numpy para cálculos numéricos avanzados, entre muchas otras. Con estas herramientas estarás listo para aprovechar al máximo las capacidades modulares de Python y construir proyectos robustos.

Empecemos.

Uso de módulos

Como ya hemos comentado, en Python los módulos y paquetes permiten organizar y reutilizar el código en diferentes proyectos. Los módulos son archivos que contienen definiciones y declaraciones de funciones, clases y variables, mientras que los paquetes son colecciones de módulos organizados en directorios. Utilizar módulos y paquetes ayuda a mantener el código modular y facilita su mantenimiento y distribución.

Un módulo en Python es simplemente un archivo con extensión .py que contiene definiciones y código que puede ser reutilizado. Al dividir el código en módulos, puedes importar y usar funciones o variables definidas en otros archivos.

Importación de módulos estándar

Python viene con una gran cantidad de módulos estándar que pueden ser importados y utilizados sin necesidad de instalación adicional. Por ejemplo, algunos módulos comunes son:

  • math: para operaciones matemáticas.
  • random: para generar números aleatorios.
  • datetime: para trabajar con fechas y horas.

Para importar un módulo, se utiliza la sintásis: import <nombre_modulo>

Ejemplo de importación de un módulo estándar:
import math

# Uso de una función del módulo math
resultado = math.sqrt(16)
print(resultado)  # Salida: 4.0

En este caso, estamos haciendo uso de la función sqrt que está definida dentro del módulo math. Esta función devuelve la raíz cuadrada del número que indiquemos como parámetro. Fíjate que delante de la función hemos incluido el nombre del módulo seguido de un «.»

Importar partes específicas de un módulo:

Si solo necesitas una parte de un módulo, puedes importar funciones o variables específicas en lugar de todo el módulo. Esto permitirá que tus programas ocupen menos memoria y sean más eficientes. Si algo no lo necesitas no lo importes.

Para importar una función sola la sintáxis es: from <nombre_modulo> import <nombre_función>

from math import sqrt

print(sqrt(25))  # Salida: 5.0

En este ejemplo solamente hemos importado la función sqrt. Si te fijas, ya no es necesario indicar delante de la función el nombre del módulo.

Asignar alias a un módulo:

Puedes darle un nombre alternativo a un módulo al importarlo, lo que puede ser útil para acortar nombres largos.

import math as m

print(m.pi)  # Salida: 3.141592653589793

En este caso, hemos asignado el alias m al módulo math, por lo tanto cuando en el resto del código hagamos uso de las funciones del módulo math podremos hacerlo abreviando con m.nombre_funcion()

Creación de módulos propios

Puedes crear tus propios módulos simplemente escribiendo funciones, clases o variables en un archivo .py y luego importándolo en otro archivo.

Ejemplo:

Imagina que tienes un archivo llamado mi_modulo.py con el siguiente contenido:

# mi_modulo.py
def saludar(nombre):
    return f"¡Hola, {nombre}!"

En otro archivo, puedes importar y usar la función saludar de este módulo:

import mi_modulo

print(mi_modulo.saludar("Ana"))  # Salida: ¡Hola, Ana!

Paquetes

Un paquete es una colección de módulos organizados en directorios que incluyen un archivo especial llamado __init__.py. Este archivo puede estar vacío o contener código de inicialización del paquete. Los paquetes permiten estructurar el código de forma jerárquica y organizada.

Estructura básica de un paquete:
mi_paquete/
    __init__.py
    modulo1.py
    modulo2.py
  • El archivo __init__.py indica a Python que el directorio mi_paquete debe tratarse como un paquete.
  • modulo1.py y modulo2.py contienen el código que deseas organizar en módulos.
Ejemplo de uso de un paquete:

Supón que en modulo1.py tienes la siguiente función:

# modulo1.py
def funcion_modulo1():
    print("Esta es una función del módulo 1")

En otro archivo, puedes importar y usar esa función:

from mi_paquete.modulo1 import funcion_modulo1

funcion_modulo1()  # Salida: Esta es una función del módulo 1

Importaciones relativas

Cuando estás trabajando dentro de un paquete, puedes usar importaciones relativas para acceder a otros módulos del mismo paquete. Esto es útil cuando el paquete tiene múltiples submódulos y deseas importarlos sin especificar el paquete completo.

Para conseguir esto, debemos incluir un «.» delante del módulo que queremos importar

Ejemplo:

Dentro de modulo2.py, puedes importar funciones de modulo1.py usando una importación relativa:

# modulo2.py
from .modulo1 import funcion_modulo1

funcion_modulo1()  # Llama a la función del módulo 1

El punto de entrada del script (__name__ == "__main__"🙂

Cada módulo en Python tiene una variable especial llamada __name__. Cuando un archivo se ejecuta directamente, el valor de __name__ será "__main__". Esto permite escribir módulos que puedan ejecutarse directamente o ser importados sin ejecutar el código completo.

Ejemplo:
# mi_modulo.py
def saludar():
    print("¡Hola, Mundo!")

if __name__ == "__main__":
    saludar()

Si ejecutas mi_modulo.py directamente, la función saludar()

Instalación de paquetes externos

Python permite instalar y utilizar paquetes de terceros mediante la herramienta pip, que es el gestor de paquetes de Python. Miles de paquetes están disponibles en el repositorio oficial, PyPI (Python Package Index), para ser instalados y utilizados.

Instalación de un paquete con pip:
pip install requests

Este comando instala el paquete requests, que es una popular librería para hacer solicitudes HTTP.

Uso de un paquete instalado:

import requests

respuesta = requests.get("https://api.github.com")
print(respuesta.status_code)  # Salida: 200

También has de saber que existe otra manera de instalar paquetes mediante la instrucción python -m pip install. Su principal objetivo es asegurarse de que estamos ejecutando pip desde el intérprete de Python correcto.

Desglose de la instrucción

  • python -m: La opción -m permite ejecutar módulos como scripts desde el intérprete de Python que estamos usando. Esto asegura que, si tienes varias versiones de Python instaladas (por ejemplo, Python 2 y Python 3), el módulo pip se ejecute con la versión específica de Python con la que lo estás llamando.
  • pip install: La instrucción pip install se usa para descargar e instalar paquetes desde el repositorio oficial de Python o desde fuentes específicas que se especifiquen.

Ejemplo de uso

python -m pip install requests

Este comando instalará requests en el entorno de Python específico desde el cual ejecutas la instrucción.

Ventajas

El uso de python -m pip puede ayudar a evitar errores comunes relacionados con versiones o instalaciones erróneas de paquetes y es una práctica recomendada para mantener coherencia entre el entorno y los paquetes instalados. También es útil al trabajar en entornos virtuales, donde necesitas instalar paquetes en un entorno específico, evitando conflictos con otras instalaciones globales.


A continuación te dejo una una tabla con algunos de los módulos estándar más comunes de Python que puedes importar y que cubren una amplia gama de funcionalidades útiles. Es muy recomendable que profundices en todas las funciones, métodos y clases que ofrece cada uno de estos módulos para poder utilizarlos y sacarles todo el partido.

MóduloDescripción
mathFunciones matemáticas como seno, coseno, logaritmos, y constantes como π.
randomGeneración de números aleatorios, selección de elementos aleatorios, mezclado de listas, etc.
datetimeManipulación de fechas y horas, creación y formato de objetos datetime, cálculos de tiempo.
timeFunciones relacionadas con el tiempo, como pausar la ejecución o medir la duración de un proceso.
osInteracción con el sistema operativo, manejo de archivos y directorios, variables de entorno, etc.
sysFunciones y variables relacionadas con el entorno de ejecución de Python, como argumentos de línea de comandos y salida del programa.
jsonManipulación de datos JSON, convertir entre JSON y objetos Python (serialización y deserialización).
csvLectura y escritura de archivos CSV, útil para datos estructurados en formato de tabla.
collectionsEstructuras de datos adicionales, como Counter, deque, namedtuple, OrderedDict, y defaultdict.
reExpresiones regulares, útil para realizar búsquedas y manipulaciones avanzadas en cadenas de texto.
loggingRegistro de mensajes, errores e información de depuración en archivos o consola para el seguimiento de la ejecución del programa.
subprocessEjecución de comandos y programas del sistema desde Python, ideal para interactuar con otros procesos.
shutilOperaciones de alto nivel con archivos y directorios, como copiar, mover y eliminar archivos.
itertoolsHerramientas para iteración avanzada, generación de combinaciones, permutaciones y manipulación de iteradores.
functoolsHerramientas para programación funcional, como reduce, partial, y decoradores.
urllibTrabaja con URLs, haciendo solicitudes HTTP y manipulando datos web.
socketNetworking de bajo nivel para creación de conexiones, ideal para trabajar con protocolos TCP y UDP.
threadingSoporte para crear y manejar hilos (threads) en Python, permitiendo la ejecución concurrente.
multiprocessingSoporte para procesamiento paralelo y concurrente en múltiples núcleos de CPU.
pickleSerialización y deserialización de objetos Python, permite guardar y cargar estructuras de datos complejas.
hashlibGeneración de hashes para cifrado y seguridad, como MD5 y SHA-1.
decimalAritmética decimal de precisión exacta, especialmente útil para cálculos financieros.
xmlProcesamiento de XML, permite manipular y analizar datos en este formato.
sqlite3Base de datos SQL integrada en Python, ideal para bases de datos pequeñas o desarrollo de prototipos.
configparserAnálisis de archivos de configuración en formato .ini, ideal para manejar configuraciones externas de aplicaciones.


Concluimos así este breve capítulo pero no por ello menos importante, pues los módulos y paquetes son un mecanismo esencial para organizar y optimizar el código en Python. Se hace especialmente importante cuando se abordan desarrollos de envergadura. La capacidad de importar módulos integrados, crear nuestros propios módulos y estructurar proyectos mediante paquetes nos permite trabajar de manera modular, manteniendo un código limpio y escalable. Además, con el uso de pip, puedes extender el alcance de los programas al integrar bibliotecas externas, facilitando así el desarrollo de las aplicaciones sin necesidad de reinventar funciones.

Pasemos ahora a la parte práctica.

Ejercicio 1: Importar y Usar el Módulo math
Crea un programa que utilice el módulo math para calcular el área y el perímetro de un círculo dado su radio. Luego, solicita al usuario que ingrese el radio y muestra los resultados en pantalla.
import math  # Importa el módulo de matemáticas

def calcular_area_circulo(radio):
    return math.pi * (radio ** 2)  # Calcula el área usando π * r²

def calcular_perimetro_circulo(radio):
    return 2 * math.pi * radio  # Calcula el perímetro usando 2π * r

# Solicita al usuario el radio
radio = float(input("Ingrese el radio del círculo: "))

# Calcula y muestra el área y el perímetro
area = calcular_area_circulo(radio)
perimetro = calcular_perimetro_circulo(radio)

print(f"Área del círculo: {area}")
print(f"Perímetro del círculo: {perimetro}")

Explicación: Aquí importamos el módulo math, que contiene la constante pi para el cálculo de áreas y perímetros de círculos. Las funciones calcular_area_circulo y calcular_perimetro_circulo usan esta constante para hacer los cálculos necesarios, y luego mostramos los resultados ingresados por el usuario.

Ejercicio 2: Crear tu Propio Módulo
Crea un módulo llamado operaciones_matematicas.py que contenga funciones para sumar, restar, multiplicar y dividir dos números. Luego, crea otro archivo main.py para importar y usar este módulo, realizando operaciones básicas entre dos números.

Código del módulo operaciones_matematicas.py:

# operaciones_matematicas.py

def sumar(a, b):
    return a + b

def restar(a, b):
    return a - b

def multiplicar(a, b):
    return a * b

def dividir(a, b):
    if b == 0:
        return "No se puede dividir por cero"
    return a / b

Código del archivo main.py:

import operaciones_matematicas  # Importa el módulo creado

# Solicita al usuario los números
num1 = float(input("Ingrese el primer número: "))
num2 = float(input("Ingrese el segundo número: "))

# Llama a las funciones del módulo
suma = operaciones_matematicas.sumar(num1, num2)
resta = operaciones_matematicas.restar(num1, num2)
multiplicacion = operaciones_matematicas.multiplicar(num1, num2)
division = operaciones_matematicas.dividir(num1, num2)

# Muestra los resultados
print(f"Suma: {suma}")
print(f"Resta: {resta}")
print(f"Multiplicación: {multiplicacion}")
print(f"División: {division}")

Explicación: Creamos un módulo propio llamado operaciones_matematicas que contiene funciones para realizar operaciones aritméticas básicas. En main.py, importamos este módulo y lo usamos para hacer operaciones entre dos números ingresados por el usuario. Esto nos permite organizar el código en diferentes archivos, haciéndolo más modular.

Ejercicio 3: Instalar y Usar un Paquete Externo (requests)
Usando pip, instala el paquete requests y crea un programa que realice una solicitud HTTP a una API de ejemplo y muestre la respuesta. Puedes usar https://jsonplaceholder.typicode.com/todos/1 para obtener datos JSON de prueba.

Instalación del paquete:

python -m pip install requests

Código:

import requests  # Importa el paquete requests

# Realiza la solicitud HTTP GET
respuesta = requests.get("https://jsonplaceholder.typicode.com/todos/1")

# Verifica que la solicitud sea exitosa
if respuesta.status_code == 200:
    datos = respuesta.json()  # Convierte la respuesta a JSON
    print("Datos obtenidos de la API:")
    print(f"ID: {datos['id']}")
    print(f"Título: {datos['title']}")
    print(f"Completado: {datos['completed']}")
else:
    print("Error al realizar la solicitud")

Explicación: Primero, instalamos el paquete requests usando pip. Luego, lo importamos en nuestro código y hacemos una solicitud GET a una API de ejemplo. Comprobamos que el código de estado de la respuesta sea 200 (éxito) y luego convertimos el contenido en formato JSON. Finalmente, mostramos la información en pantalla.

Bibliografía de Python de interés.

Logo Python, enlace a la web oficial de Python.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *