Llevo años shippeando código en JavaScript, TypeScript y Go. Python era el hueco. Me hice Python Crash Course de Eric Matthes de principio a fin, y es uno de los mejores recursos que he usado para pasar de cero a "puedo construir y shippear Python". Estructura clara, sin fluff, y ejercicios que te obligan a teclear código en vez de hojear. Cuando lo terminas, tienes suficiente para escribir scripts, pequeñas herramientas y leer Python de producción con confianza.
Esto es lo que el libro te da al final, una cosa que no enfatiza lo suficiente (entornos virtuales), y algo un poco más avanzado: escribir tu propio context manager para poder usar with con tus propios recursos.
Después de terminar el libro
Para cuando terminas Python Crash Course, ya tienes variables, strings, números, listas, condicionales, loops, diccionarios, input de usuario, while, funciones, clases, archivos y al menos un proyecto (juego, data viz o web app). Tienes f-strings, list comprehensions, .get() y .items(), y el hábito de "corre, rompe, arregla". Los ejercicios son la mezcla justa de guiados y abiertos. Hacerlos todos es lo que hace que se pegue.
Un patrón que rinde en todas partes: acceso seguro a dicts. En código real muchas veces no sabes si una clave existe. Usar dict.get(key, default) en vez de dict[key] evita KeyError. Envolver eso en un helper pequeño para claves anidadas evita que los scripts revienten por datos faltantes —más sobre esto abajo.
Lo que necesitas en el mundo real: entornos virtuales
El libro te pone a escribir Python; no dedica mucho tiempo a dónde lo ejecutas. En la práctica, nunca instalas paquetes globalmente. Usas un entorno aislado por proyecto. Para eso está venv (viene con Python).
Por qué importa venv
- Dependencias: El proyecto A necesita
requests==2.28, el proyecto B necesita2.31. Una instalación global no puede satisfacer a ambos. - Reproducibilidad:
pip freeze > requirements.txtypip install -r requirements.txtpara que tú y otros puedan recrear el mismo entorno. - Sin polución: Tu Python del sistema queda limpio; nada de
sudo pip installni líos de permisos.
Loop rápido
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
# ... work ...
pip freeze > requirements.txt
deactivate
Crear → activar → instalar → freeze cuando cambian deps → deactivate. Cuando eso es memoria muscular, listo.
Acceso anidado seguro: un helper pequeño
Un patrón mínimo para leer claves anidadas de dicts (p. ej. de JSON o respuestas de API) sin crashear por claves faltantes:
import json
def get_nested(data: dict, *keys, default=None):
"""Get a nested key without KeyError. Example: get_nested(d, 'user', 'address', 'city')"""
for key in keys:
if not isinstance(data, dict):
return default
data = data.get(key)
if data is None:
return default
return data
with open("config.json") as f:
config = json.load(f)
city = get_nested(config, "user", "address", "city", default="unknown")
print(f"City: {city}")
data.get(key) devuelve None o tu default si falta la clave. Encadenar eso en un loop te da acceso profundo seguro. El type hint data: dict ayuda cuando el script crece.
Súper técnico: escribir tu propio context manager
El libro muestra with open(...) as f. Usas with para que el archivo se cierre aunque haya una excepción. Eso es un context manager. Cuando sabes cómo funcionan, puedes escribir los tuyos para cualquier patrón "setup → uso → teardown": locks, timers, estado temporal, sesiones de API, etc.
Python te da dos formas de implementar uno.
1. Basado en clases: __enter__ y __exit__
Cualquier clase que defina __enter__ y __exit__ puede usarse con with:
import time
class Timer:
"""Context manager that prints how long the block took."""
def __enter__(self):
self.start = time.perf_counter()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
elapsed = time.perf_counter() - self.start
print(f"Elapsed: {elapsed:.3f}s")
return False # don't suppress exceptions
# Usage
with Timer():
time.sleep(0.1)
# Elapsed: 0.100s
__enter__corre al entrar al bloquewith; su return es lo que recibes tras elas(p. ej.with Timer() as t:).__exit__corre al salir del bloque (normal o por excepción). Los tres argumentos son el tipo, valor y traceback de la excepción; si devuelvesTrue, Python la traga. DevolverFalse(o nada) la re-lanza.- Aquí solo lo usamos para medir tiempo e imprimir; no suprimimos errores.
2. Basado en generadores: @contextmanager
Para casos simples, un generador más contextlib.contextmanager es menos boilerplate:
from contextlib import contextmanager
@contextmanager
def temporary_override(obj, attr, value):
"""Temporarily override an attribute; restore it when leaving the block."""
old = getattr(obj, attr, None)
setattr(obj, attr, value)
try:
yield
finally:
if old is not None:
setattr(obj, attr, old)
else:
delattr(obj, attr)
# Example: temporarily change a config
class Config:
debug = False
with temporary_override(Config, "debug", True):
print(Config.debug) # True
print(Config.debug) # False again
- Todo lo anterior al
yieldes "setup"; todo lo posterior (en elfinally) es "teardown". - El
finallygarantiza que el teardown corre aunque el bloque lance. Eso es lo que hace seguros a los context managers. - Este patrón aparece en todas partes: mocking en tests, cambiar env vars, adquirir y liberar locks.
Por qué merece la pena saberlo
Cuando sabes escribir un context manager, dejas de repetir try/finally a mano para el mismo recurso. Tienes un solo lugar que es dueño de "abrir/cerrar" o "adquirir/liberar", y quien llama solo escribe with MyResource():. Es la misma idea que with open(...) pero para tus propias abstracciones. El libro no profundiza aquí; aprenderlo por tu cuenta es un buen siguiente paso tras terminar el último capítulo.
Qué sigue
Tras terminar Python Crash Course tienes suficiente para escribir CLI tools, automatizar tareas y leer el Python de otros. Adopta venv y el acceso seguro a dicts pronto; añade context managers cuando empieces a construir cosas que gestionan recursos (archivos, conexiones, locks). Si estás con el libro o vienes de otro lenguaje, esas tres te harán el código más profesional y menos "solo-tutorial".