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
1import math
2import random
3
4# Calcular raíz cuadrada usando math
5raiz = math.sqrt(16)
6print(f"La raíz cuadrada de 16 es: {raiz}")
7
8# Elegir un número al azar del 1 al 10 usando random
9numero_suerte = random.randint(1, 10)
10print(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)
2pip 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
3import rutificador
4
5# Formatear un RUT sucio a formato estándar con puntos y guion
6rut_sucio = "19234567k"
7rut_formateado = rutificador.format_rut(rut_sucio)
8print(f"RUT Formateado: {rut_formateado}") # 19.234.567-K
9
10# Validar RUT directamente
11es_valido = rutificador.validate_rut(rut_sucio)
12print(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
2from cryptography.fernet import Fernet
3
4# 1. Generamos una llave de encriptación segura
5llave = Fernet.generate_key()
6fernet_client = Fernet(llave)
7
8# 2. Encriptamos información sensible (como la contraseña de un cliente)
9password_secreta = b"CafeteraUltraSegura2026"
10password_encriptada = fernet_client.encrypt(password_secreta)
11
12print(f"Llave de Encriptación: {llave.decode()}")
13print(f"Password Encriptada (Bytes cifrados): {password_encriptada.decode()}")
14
15# 3. Desencriptamos para recuperar el texto original
16password_desencriptada = fernet_client.decrypt(password_encriptada)
17print(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
1import requests
2
3# URL de la API pública para obtener al personaje ID 1 (Rick Sanchez)
4url = "https://rickandmortyapi.com/api/character/1"
5
6try:
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
28except 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
1import requests
2
3# Buscamos al pokemon Ditto en la API pública de Pokémon
4pokemon = "ditto"
5url = f"https://pokeapi.co/api/v2/pokemon/{pokemon}"
6
7try:
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.")
26except 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íaComando de InstalaciónPropósito / ¿Por qué es famosa?
requestsInternet y APIspip install requestsLa librería estándar de facto para consumir APIs y hacer peticiones HTTP (GET, POST).
pandasCiencia de Datospip install pandasManipulación y análisis de datos estructurados (tablas gigantes, archivos Excel y CSV).
cryptographyCiberseguridadpip install cryptographyProvee recetas y primitivas criptográficas seguras y robustas para cifrar contraseñas y archivos.
flask / fastapiDesarrollo Webpip install fastapi uvicornPermiten crear servidores, microservicios y APIs web hiperrápidas listas para producción.
richInterfaz de Consolapip install richHacer que la salida de texto de tu consola sea hermosa (colores, paneles, emojis y barras de progreso).
pytestCalidad y Pruebaspip install pytestEscribir y automatizar pruebas unitarias e integrales para certificar que el software no falle.
openaiInteligencia Artificialpip install openaiLibrerí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
1from flask import Flask
2
3# Inicializamos nuestra aplicación Web Flask
4app = Flask(__name__)
5
6# Definimos la ruta principal '/'
7@app.route("/")
8def home():
9 return "<h1>☕ ¡Bienvenido a la Cafetería Web en Flask! ☕</h1><p>Página servida con Python.</p>"
10
11if __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
1from 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)
5client = OpenAI(
6 api_key="TU_LLAVE_DE_DEEPSEEK",
7 base_url="https://api.deepseek.com"
8)
9
10response = 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
19print(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
1from rich import print
2from rich.table import Table
3
4# ¡Rich nos permite imprimir con emojis, colores y tablas hermosas!
5tabla = Table(title="Menú de Cafetería Premium")
6
7tabla.add_column("Código", style="cyan", no_wrap=True)
8tabla.add_column("Producto", style="magenta")
9tabla.add_column("Precio", style="green", justify="right")
10
11tabla.add_row("C01", "Café Latte Espumoso", "$1.800")
12tabla.add_row("C02", "Expreso Doble carga", "$1.500")
13tabla.add_row("C03", "Muffin Relleno de Arándano", "$1.200")
14
15print(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
2from sqlalchemy import create_engine, Column, Integer, String, Float
3from sqlalchemy.orm import declarative_base, sessionmaker
4
5# 1. Creamos la conexión al motor de base de datos local SQLite (archivo local)
6engine = create_engine("sqlite:///cafeteria.db", echo=False)
7Base = declarative_base()
8
9# 2. Definimos la estructura de nuestra tabla 'productos' usando clases (ORM)
10class 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
17Base.metadata.create_all(engine)
18
19# 3. Configuramos la sesión de transacciones
20Session = sessionmaker(bind=engine)
21session = Session()
22
23# --- OPERACIONES CRUD ---
24
25# C - CREATE: Insertamos dos nuevos productos
26p1 = Producto(nombre="Café Americano", precio=2.50)
27p2 = Producto(nombre="Muffin de Chocolate", precio=1.80)
28session.add_all([p1, p2])
29session.commit()
30print("✔ Productos guardados con éxito en SQLite.")
31
32# R - READ: Consultamos todos los productos de la base de datos
33todos = session.query(Producto).all()
34print("\n--- Catálogo de Productos ---")
35for p in todos:
36 print(f"[{p.id}] {p.nombre} - ${p.precio} USD")
37
38# U - UPDATE: Actualizamos el precio del Café Americano
39americano = session.query(Producto).filter_by(nombre="Café Americano").first()
40if 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
46muffin = session.query(Producto).filter_by(nombre="Muffin de Chocolate").first()
47if 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
1requests==2.31.0
2flask==3.0.2
3rich==13.7.1
4openai==1.12.0

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

Terminal
BASH
1pip 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
1import requests
2
3# 1. Pide al usuario el ID de un personaje
4try:
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
9except ValueError:
10 print("Entrada inválida. Usando ID 1 por defecto...")
11 personaje_id = 1
12
13url = f"https://rickandmortyapi.com/api/character/{personaje_id}"
14
15try:
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.")
27except 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.