Café y Código

15. Módulos y PIP: ¡El Superpoder de No Reinventar la Rueda! 🌌

¿Qué es un Módulo y una Librería?

Hasta ahora has escrito todo tu código en un único archivo. Pero en la vida real, los proyectos tienen miles de líneas. Para no perderte, dividimos el código en piezas llamadas Módulos (que no son más que otros archivos .py con funciones listas para usar).

Python viene con "baterías incluidas". Es decir, trae una Librería Estándar repleta de módulos listos que puedes importar usando la palabra clave import.

librerias.py
PYTHON
1 import math
2 import random
3
4 # Calcular raíz cuadrada usando math
5 raiz = math.sqrt(16)
6 print(f"La raíz cuadrada de 16 es: {raiz}")
7
8 # Elegir un número al azar del 1 al 10 usando random
9 numero_suerte = random.randint(1, 10)
10 print(f"Tu número de la suerte hoy es: {numero_suerte}")

Crea tus propios Módulos: Caso Práctico Validador de RUT 🛠️

Puedes importar funciones creadas por ti mismo ubicadas en otros archivos en la misma carpeta. Esto permite separar la lógica matemática pesada de tu programa principal.

A continuación, te mostramos el diseño de un entorno de desarrollo (IDE) con dos archivos: un módulo validador de RUT chileno (`validador_rut.py`) y el script principal (`main.py`) que lo consume.

EXPLORADOR
📁 proyecto_validador

¿Qué es PIP y cómo funciona? 📦

Imagina que compras un teléfono nuevo. Viene con la app de llamadas y calculadora (Librería estándar). Pero si quieres jugar o chatear, vas a la App Store o Play Store y te descargas aplicaciones que otras personas programaron.

🚀 PIP: El Gestor de Paquetes oficial de Python
PIP es la "App Store" de Python. Es una herramienta de consola que te permite descargar e instalar librerías externas gratuitas desarrolladas por la comunidad global de programadores (almacenadas en un sitio web llamado PyPI).

Para instalar una librería desde tu terminal de Windows/Mac (fuera de Python), usas el comando:

Terminal
BASH
1 # Escribe esto en tu consola o terminal (fuera de Python)
2 pip install requests

¿Para qué escribir todo a mano? ¡Usa PIP! 📦⚡

Para resolver el validador de RUT que programamos arriba, no es necesario inventar la rueda de nuevo. En PyPI existe una librería oficial llamada rutificador que resuelve esto en un segundo.

uso_rutificador.py
PYTHON
1 # Ejemplo usando la librería oficial 'rutificador'
2 # Primero instalas con: pip install rutificador
3 import rutificador
4
5 # Formatear un RUT sucio a formato estándar con puntos y guion
6 rut_sucio = "19234567k"
7 rut_formateado = rutificador.format_rut(rut_sucio)
8 print(f"RUT Formateado: {rut_formateado}") # 19.234.567-K
9
10 # Validar RUT directamente
11 es_valido = rutificador.validate_rut(rut_sucio)
12 print(f"¿Es un RUT válido?: {es_valido}") # True o False

Ciberseguridad Práctica: pip install cryptography 🛡️

Otro uso increíble de PIP es la ciberseguridad. Si necesitas proteger los datos de tus clientes (como tarjetas, emails o passwords en tu base de datos), puedes instalar cryptography para cifrar y descifrar la información de forma militar con un estándar llamado Fernet:

encriptacion_segura.py
PYTHON
1 # Primero instalas con: pip install cryptography
2 from cryptography.fernet import Fernet
3
4 # 1. Generamos una llave de encriptación segura
5 llave = Fernet.generate_key()
6 fernet_client = Fernet(llave)
7
8 # 2. Encriptamos información sensible (como la contraseña de un cliente)
9 password_secreta = b"CafeteraUltraSegura2026"
10 password_encriptada = fernet_client.encrypt(password_secreta)
11
12 print(f"Llave de Encriptación: {llave.decode()}")
13 print(f"Password Encriptada (Bytes cifrados): {password_encriptada.decode()}")
14
15 # 3. Desencriptamos para recuperar el texto original
16 password_desencriptada = fernet_client.decrypt(password_encriptada)
17 print(f"Password Recuperada: {password_desencriptada.decode()}")

Paso a Paso Práctico: Conectando con la API de Rick and Morty 👽

La librería externa requests es la más famosa del mundo para conectarse a internet. Vamos a usarla para comunicarnos con la API oficial de Rick and Morty y traer la ficha técnica de un personaje real en vivo.

  1. Abre tu terminal e instala la librería con pip install requests.
  2. Crea un archivo llamado rick_api.py.
  3. Copia, ejecuta el siguiente código y asómbrate con la respuesta:
rick_api.py
PYTHON
1 import requests
2
3 # URL de la API pública para obtener al personaje ID 1 (Rick Sanchez)
4 url = "https://rickandmortyapi.com/api/character/1"
5
6 try:
7 # Realizamos la petición GET a la API
8 respuesta = requests.get(url)
9
10 # Convertimos la respuesta JSON en un diccionario de Python
11 datos = respuesta.json()
12
13 # Extraemos información de forma estructurada
14 nombre = datos.get("name")
15 estado = datos.get("status")
16 especie = datos.get("species")
17 origen = datos.get("origin", {}).get("name")
18
19 print("========================================")
20 print(" FICHA DE PERSONAJE RICK & MORTY ")
21 print("========================================")
22 print(f"Nombre: {nombre}")
23 print(f"Estado: {estado} (¡{'Vivo' if estado == 'Alive' else 'Muerto o Desconocido'}!)")
24 print(f"Especie: {especie}")
25 print(f"Origen: {origen}")
26 print("========================================")
27
28 except requests.exceptions.RequestException as e:
29 print(f"❌ Error de conexión al servidor: {e}")

Conectando con la API de Pokémon (PokéAPI) 🐹

¡Intentémoslo ahora con otra API sumamente popular! Usaremos la PokéAPI para consultar información detallada de cualquier Pokémon (como sus habilidades y peso) usando el mismo paquete requests.

pokemon_api.py
PYTHON
1 import requests
2
3 # Buscamos al pokemon Ditto en la API pública de Pokémon
4 pokemon = "ditto"
5 url = f"https://pokeapi.co/api/v2/pokemon/{pokemon}"
6
7 try:
8 respuesta = requests.get(url)
9 if respuesta.status_code == 200:
10 datos = respuesta.json()
11 nombre = datos.get("name").capitalize()
12 peso = datos.get("weight") / 10 # Convertimos de hectogramos a kilogramos
13
14 # Extraemos las habilidades del Pokémon
15 habilidades = [h.get("ability").get("name") for h in datos.get("abilities", [])]
16
17 print("=============================")
18 print(f" DATOS DE POKÉMON: {nombre} 🐹")
19 print("=============================")
20 print(f"Nombre: {nombre}")
21 print(f"Peso: {peso} kg")
22 print(f"Habilidades: {', '.join(habilidades)}")
23 print("=============================")
24 else:
25 print("❌ No pudimos encontrar ese Pokémon.")
26 except requests.exceptions.RequestException as e:
27 print(f"❌ Error de conexión al servidor: {e}")

Tabla de las Librerías PIP Más Utilizadas en la Industria 🏆📊

El ecosistema de Python es gigante. Para ayudarte a navegarlo, te presentamos una tabla resumen de los paquetes más populares del mundo y por qué todo desarrollador profesional debe conocerlos:

Librería (PIP) Categoría Comando de Instalación Propósito / ¿Por qué es famosa?
requests Internet y APIs pip install requests La librería estándar de facto para consumir APIs y hacer peticiones HTTP (GET, POST).
pandas Ciencia de Datos pip install pandas Manipulación y análisis de datos estructurados (tablas gigantes, archivos Excel y CSV).
cryptography Ciberseguridad pip install cryptography Provee recetas y primitivas criptográficas seguras y robustas para cifrar contraseñas y archivos.
flask / fastapi Desarrollo Web pip install fastapi uvicorn Permiten crear servidores, microservicios y APIs web hiperrápidas listas para producción.
rich Interfaz de Consola pip install rich Hacer que la salida de texto de tu consola sea hermosa (colores, paneles, emojis y barras de progreso).
pytest Calidad y Pruebas pip install pytest Escribir y automatizar pruebas unitarias e integrales para certificar que el software no falle.
openai Inteligencia Artificial pip install openai Librería oficial para conectar tus proyectos con Modelos de Lenguaje (ChatGPT, DeepSeek, Claude).

Las mejores Librerías (PIP) para Experimentar 🧪

Python tiene miles de paquetes maravillosos. Aquí tienes una selección premium de los mejores y cómo se usan en código real:

🌐 1. Flask (Crear Servidores y Páginas Web)

¿Quieres transformar tu script de Python en un sitio web real? Con pip install flask puedes levantar un servidor web local en solo 5 líneas de código:

servidor_web.py
PYTHON
1 from flask import Flask
2
3 # Inicializamos nuestra aplicación Web Flask
4 app = Flask(__name__)
5
6 # Definimos la ruta principal '/'
7 @app.route("/")
8 def home():
9 return "<h1>☕ ¡Bienvenido a la Cafetería Web en Flask! ☕</h1><p>Página servida con Python.</p>"
10
11 if __name__ == "__main__":
12 # Iniciamos el servidor en el puerto 5000
13 app.run(debug=True)

🤖 2. OpenAI / DeepSeek (Conectar Inteligencia Artificial)

Puedes conectar tus programas de Python a modelos de Inteligencia Artificial como DeepSeek o GPT-4 instalando la librería oficial de API: pip install openai.

conexion_ia.py
PYTHON
1 from openai import OpenAI
2
3 # Conectamos con el cliente compatible con OpenAI de DeepSeek
4 # (DeepSeek usa el mismo estándar de librerías que OpenAI)
5 client = OpenAI(
6 api_key="TU_LLAVE_DE_DEEPSEEK",
7 base_url="https://api.deepseek.com"
8 )
9
10 response = client.chat.completions.create(
11 model="deepseek-chat",
12 messages=[
13 {"role": "system", "content": "Eres un barista experto en café y Python."},
14 {"role": "user", "content": "Dame una receta corta de café usando Python."}
15 ],
16 stream=False
17 )
18
19 print(response.choices[0].message.content)

🎨 3. Rich (Diseño Espectacular en Consola)

¿Cansado de la consola aburrida y monótona? Con pip install rich puedes imprimir texto en colores, cajas, emojis y tablas espectaculares de forma muy sencilla:

diseno_consola.py
PYTHON
1 from rich import print
2 from rich.table import Table
3
4 # ¡Rich nos permite imprimir con emojis, colores y tablas hermosas!
5 tabla = Table(title="Menú de Cafetería Premium")
6
7 tabla.add_column("Código", style="cyan", no_wrap=True)
8 tabla.add_column("Producto", style="magenta")
9 tabla.add_column("Precio", style="green", justify="right")
10
11 tabla.add_row("C01", "Café Latte Espumoso", "$1.800")
12 tabla.add_row("C02", "Expreso Doble carga", "$1.500")
13 tabla.add_row("C03", "Muffin Relleno de Arándano", "$1.200")
14
15 print(tabla)

Bases de Datos Locales: SQLite3 y SQLAlchemy (CRUD completo) 🗄️

Cuando necesitas almacenar información de manera persistente (por ejemplo, el menú o los clientes de tu cafetería), las bases de datos son tus mejores aliadas.

Python incluye por defecto la librería sqlite3, una base de datos ligera que se guarda en un solo archivo local. Sin embargo, en el mundo profesional es muy común utilizar un ORM (Object-Relational Mapping) como SQLAlchemy. Un ORM te permite interactuar con la base de datos usando clases y objetos de Python en lugar de escribir consultas SQL a mano.

💡 ¿Qué es CRUD?
Es el acrónimo para las cuatro operaciones fundamentales de una base de datos: Create (Crear/Insertar), Read (Leer/Consultar), Update (Actualizar) y Delete (Eliminar).

Para este ejemplo, primero instala SQLAlchemy con pip install sqlalchemy y luego ejecuta el siguiente código para ver un CRUD completo automatizado:

db_crud.py
PYTHON
1 # Instalación previa: pip install sqlalchemy
2 from sqlalchemy import create_engine, Column, Integer, String, Float
3 from sqlalchemy.orm import declarative_base, sessionmaker
4
5 # 1. Creamos la conexión al motor de base de datos local SQLite (archivo local)
6 engine = create_engine("sqlite:///cafeteria.db", echo=False)
7 Base = declarative_base()
8
9 # 2. Definimos la estructura de nuestra tabla 'productos' usando clases (ORM)
10 class Producto(Base):
11 __tablename__ = "productos"
12 id = Column(Integer, primary_key=True)
13 nombre = Column(String(50), nullable=False)
14 precio = Column(Float, nullable=False)
15
16 # Creamos físicamente la tabla y el archivo .db si no existen
17 Base.metadata.create_all(engine)
18
19 # 3. Configuramos la sesión de transacciones
20 Session = sessionmaker(bind=engine)
21 session = Session()
22
23 # --- OPERACIONES CRUD ---
24
25 # C - CREATE: Insertamos dos nuevos productos
26 p1 = Producto(nombre="Café Americano", precio=2.50)
27 p2 = Producto(nombre="Muffin de Chocolate", precio=1.80)
28 session.add_all([p1, p2])
29 session.commit()
30 print("✔ Productos guardados con éxito en SQLite.")
31
32 # R - READ: Consultamos todos los productos de la base de datos
33 todos = session.query(Producto).all()
34 print("\n--- Catálogo de Productos ---")
35 for p in todos:
36 print(f"[{p.id}] {p.nombre} - ${p.precio} USD")
37
38 # U - UPDATE: Actualizamos el precio del Café Americano
39 americano = session.query(Producto).filter_by(nombre="Café Americano").first()
40 if americano:
41 americano.precio = 2.80
42 session.commit()
43 print("\n✔ Precio del Café Americano actualizado.")
44
45 # D - DELETE: Eliminamos el Muffin de Chocolate
46 muffin = session.query(Producto).filter_by(nombre="Muffin de Chocolate").first()
47 if muffin:
48 session.delete(muffin)
49 session.commit()
50 print("✔ Muffin eliminado del catálogo.")

El archivo requirements.txt 📋

Cuando trabajas en equipo o subes tu código a la nube, no compartes la carpeta de librerías descargadas (que son gigabytes). En su lugar, creas un archivo de texto llamado requirements.txt que actúa como la lista de compras de tus dependencias:

requirements.txt
PLAINTEXT
1 requests==2.31.0
2 flask==3.0.2
3 rich==13.7.1
4 openai==1.12.0

Cualquier otro programador puede instalar de golpe todas las librerías necesarias con un único comando:

Terminal
BASH
1 pip install -r requirements.txt

🐍 Ponte a prueba: El Buscador Multiverso

Escribe un programa que solicite al usuario ingresar un número de ID por consola, haga una petición GET a la API de Rick and Morty para ese ID específico, y si existe, muestre en pantalla el Nombre, Género y si está Vivo o Muerto. ¡Agrega control de excepciones por si el ID ingresado no existe o no hay internet!

👁️ Ver solución sugerida
buscador_rick.py
PYTHON
1 import requests
2
3 # 1. Pide al usuario el ID de un personaje
4 try:
5 personaje_id = int(input("Ingresa el ID del personaje de Rick & Morty a buscar (1 al 826): "))
6 if personaje_id < 1 or personaje_id > 826:
7 print("ID fuera de rango. Intentando con ID 1 por defecto...")
8 personaje_id = 1
9 except ValueError:
10 print("Entrada inválida. Usando ID 1 por defecto...")
11 personaje_id = 1
12
13 url = f"https://rickandmortyapi.com/api/character/{personaje_id}"
14
15 try:
16 respuesta = requests.get(url)
17 if respuesta.status_code == 200:
18 datos = respuesta.json()
19 nombre = datos.get("name")
20 estado = datos.get("status")
21 genero = datos.get("gender")
22
23 print(f"\n✔ Encontrado: {nombre}")
24 print(f"Género: {genero} | Estado de salud: {estado}")
25 else:
26 print("❌ No pudimos encontrar ese personaje.")
27 except Exception as e:
28 print(f"❌ Ocurrió un error: {e}")

Prueba de Conocimientos 📝

Dato curioso: Primera versión pública en 1991; Guido van Rossum. Wikipedia

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.