Plan de Aprendizaje Completo: Python avanzado
Objetivo: Leer el código de FastAPI, Django, Pandas y PySpark y reconocer el mecanismo de Python que está debajo: un decorador, un generador, un tipo o una espera.
Metodología: Intermedio y POO van antes. Cada fase muestra el mismo recurso en Python puro y dice en qué librería lo vas a volver a ver.
Tus apuntes van en Mis notas.
Índice
- Fase 1: Decoradores
- Fase 2: Gestores de contexto
- Fase 3: Tipado que los frameworks exigen
- Fase 4: Hilos, procesos y asyncio
- Fase 5: Logging, empaquetado y pruebas
- Proyectos integradores
Fase 1: Decoradores
Meta: Entender que
@algoes una función que envuelve otra.
- Una función puede recibir y devolver otra función
- Escribir un decorador que mide el tiempo y conserva el nombre con
functools.wraps - Decorador con argumentos
- Dónde vuelve a aparecer:
@app.geten FastAPI,@login_requireden Django,@propertyen una clase - 🧪 Práctica:
@medirsobre tres funciones y un log con el nombre real, nowrapper.
Fase 2: Gestores de contexto
Meta: Abrir y cerrar un recurso aunque la operación falle.
-
withy el protocolo__enter__/__exit__ -
contextlib.contextmanagerpara no escribir una clase - Varios recursos en un solo
with - Dónde vuelve a aparecer: sesión de SQLAlchemy, archivo, cliente HTTP, lock
- 🧪 Práctica: Un contexto que abre un archivo de log y lo cierra, y otro que hace
rollbacksi hubo excepción.
Fase 3: Tipado que los frameworks exigen
Meta: Anotar funciones y estructuras como lo hacen FastAPI y las firmas de Pandas.
-
list[int],dict[str, float],tuple[int, str],set[str] -
str | Nonepara un campo opcional -
Literal,TypedDictyCallable -
Annotatedpara colgar metadatos de un tipo, que es la forma moderna de los parámetros de FastAPI - Pasar el archivo por
pyrightomypyy corregir lo que marque - 🧪 Práctica: Las funciones del proyecto de POO quedan anotadas y el type checker pasa en modo básico.
Fase 4: Hilos, procesos y asyncio
Meta: Elegir la herramienta según si el programa espera o calcula.
- I/O-bound frente a CPU-bound
-
threadingcuando esperas y la librería no es async -
multiprocessingcuando el CPU está ocupado (un cálculo de Pandas o un UDF pesado no se arregla conasync) -
async/await,asyncio.gathery el error de metertime.sleepdentro deasync def - Dónde vuelve a aparecer: endpoints
asyncde FastAPI, el driver de Spark que no debes bloquear,asyncioen un cliente HTTP - 🧪 Práctica: Diez esperas de un segundo, primero secuenciales y después con
gather. Anota los tiempos.
Fase 5: Logging, empaquetado y pruebas
Meta: Un módulo que otra persona instala y prueba, no un notebook de un solo uso.
-
loggingcon niveles, noprintpara diagnosticar - Paquete con
pyproject.tomlo al menos instalable en el venv -
pytest: un test del camino feliz y uno del error - Dónde vuelve a aparecer: tests de una API, logs de un job de Spark, el paquete que Airflow importa
- 🧪 Práctica: El dominio de tareas tiene dos tests y un log cuando una transición de estado se rechaza.
Proyectos integradores
- Mini librería
tareas— dominio de la guía de POO, decorador de tiempo, contexto de unidad de trabajo y tipos. - Cliente concurrente — baja o simula varias respuestas y deja un log por cada fallo, sin tumbar el lote.
Recursos
| Recurso | Uso |
|---|---|
| functools | wraps |
| contextlib | with propio |
| typing | Anotaciones |
| asyncio | Concurrencia de espera |
| pytest | Pruebas |
Criterios de avance
| Fase | La dominas cuando... |
|---|---|
| 1 | Lees @app.get y sabes que es una función envolviendo a tu función |
| 2 | Un recurso se cierra solo si el bloque falla |
| 3 | Anotas una función opcional y el editor te avisa si pasas el tipo mal |
| 4 | Decides hilo, proceso o asyncio con una frase, según espera o cálculo |
| 5 | pytest falla si quitas una regla del dominio |