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 directoriomi_paquete
debe tratarse como un paquete. modulo1.py
ymodulo2.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.
@Tip. Dependiendo de la versión de python que tengas instalada puede que tengas que utilizar pip3 en lugar de pip. Pero el funcionamiento es exactamente igual.
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ódulopip
se ejecute con la versión específica de Python con la que lo estás llamando.pip install
: La instrucciónpip 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ódulo | Descripción |
---|---|
math | Funciones matemáticas como seno, coseno, logaritmos, y constantes como π. |
random | Generación de números aleatorios, selección de elementos aleatorios, mezclado de listas, etc. |
datetime | Manipulación de fechas y horas, creación y formato de objetos datetime , cálculos de tiempo. |
time | Funciones relacionadas con el tiempo, como pausar la ejecución o medir la duración de un proceso. |
os | Interacción con el sistema operativo, manejo de archivos y directorios, variables de entorno, etc. |
sys | Funciones y variables relacionadas con el entorno de ejecución de Python, como argumentos de línea de comandos y salida del programa. |
json | Manipulación de datos JSON, convertir entre JSON y objetos Python (serialización y deserialización). |
csv | Lectura y escritura de archivos CSV, útil para datos estructurados en formato de tabla. |
collections | Estructuras de datos adicionales, como Counter , deque , namedtuple , OrderedDict , y defaultdict . |
re | Expresiones regulares, útil para realizar búsquedas y manipulaciones avanzadas en cadenas de texto. |
logging | Registro de mensajes, errores e información de depuración en archivos o consola para el seguimiento de la ejecución del programa. |
subprocess | Ejecución de comandos y programas del sistema desde Python, ideal para interactuar con otros procesos. |
shutil | Operaciones de alto nivel con archivos y directorios, como copiar, mover y eliminar archivos. |
itertools | Herramientas para iteración avanzada, generación de combinaciones, permutaciones y manipulación de iteradores. |
functools | Herramientas para programación funcional, como reduce , partial , y decoradores. |
urllib | Trabaja con URLs, haciendo solicitudes HTTP y manipulando datos web. |
socket | Networking de bajo nivel para creación de conexiones, ideal para trabajar con protocolos TCP y UDP. |
threading | Soporte para crear y manejar hilos (threads) en Python, permitiendo la ejecución concurrente. |
multiprocessing | Soporte para procesamiento paralelo y concurrente en múltiples núcleos de CPU. |
pickle | Serialización y deserialización de objetos Python, permite guardar y cargar estructuras de datos complejas. |
hashlib | Generación de hashes para cifrado y seguridad, como MD5 y SHA-1. |
decimal | Aritmética decimal de precisión exacta, especialmente útil para cálculos financieros. |
xml | Procesamiento de XML, permite manipular y analizar datos en este formato. |
sqlite3 | Base de datos SQL integrada en Python, ideal para bases de datos pequeñas o desarrollo de prototipos. |
configparser | Aná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.
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.
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.
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.
- Curso de Programación Python. Autor: Arturo Montejo Ráez y Salud María Jiménez Zafra (Editorial Anaya)
- Aprende Python desde cero hasta avanzado. Autor: Xavier Reyes Ochoa (Editorial Book Shelter GmbH)
- Aprende la Programación Orientada a Objetos con el lenguaje Python. Autor: Vincent Boucheny (Editorial Ediciones ENI)
- 100 Ejercicios Python para praticar. Autor: Laurentine K.Masson (Editorial: Publicación Independiente).