6.3Buenas prácticas y trampas
Lo esencial en 30 segundos
- Regla de oro : legible (black), probado (pytest), portable (venv), entregado (CI) — aplicadas siempre, no una vez.
- Hacer : nombres explícitos, return + valores inmutables, with + pathlib, .get, try estrechos, venv fijado, pruebas antes, vectorizar, pre-commit, CI guardiana.
- Evitar : nombres crípticos, print en lugar de return, concatenaciones +, except desnudo, .venv versionado, CI « más tarde », secretos en claro.
Hilo Nabil — los criterios pegados en la pared
Tras un año, Nabil pegó cuatro palabras en la pared en Argel : legible, probado, portable, entregado. Lo que más contó no es una librería, sino tres hábitos — nombrar explícitamente, probar antes, aislar en venv — y su mayor trampa evitada por poco : un .venv versionado con secretos en claro durante una semana de rush.
Elige un solo hábito a fijar en tu ritual, y luego pasa al siguiente.
El contrato de confianza
Un código sano depende de pocas reglas, aplicadas siempre. Aquí están, con sus inversos a desterrar.
✓ Qué hacer
- Nombres explícitos (verbos, snake_case), una responsabilidad por función.
- return el resultado, valores inmutables (None), datos en argumentos.
- f-strings, with + encoding, pathlib para las rutas.
- Buen contenedor para cada uso, .get() con valor por defecto, copias conscientes.
- try estrechos y precisos, else/finally, raise pronto, nunca except desnudo.
- Estándar primero, venv + requirements fijados, importaciones absolutas.
- Pruebas antes (rojo-verde), límites + errores, hints en las fronteras.
- Vectorizar lo grande, yield lo gigante, async la espera.
- black/ruff en pre-commit, patrones nombrados, SOLID pragmático.
- CI guardiana, versiones + rollback, secretos fuera del código.
✗ Qué no hacer nunca
- Nombres crípticos (x2, tmp2, data2) y funciones de 200 líneas.
- print en lugar de return, valores mutables, globales modificados.
- Concatenaciones +, open() sin with, rutas codificadas en duro.
- Listas para buscar por clave, accesos directos sin get, = para copiar.
- except: pass, try alrededor de todo, silenciar los fallos.
- Todo en global, .venv versionado, from x import *.
- Pruebas después (o nunca), solo lo nominal, 100 % fetiche.
- Bucles for sobre millones, listas gigantes, requests en el async.
- Estilo debatido a mano, god-objects, fábricas para 50 líneas.
- CI « más tarde », secretos en claro, prod sin retorno.
Guion listo para decir — verificar su práctica antes de entregar (30 s)
« ¿Legible (black) ? ¿Probado (pytest nominal + límites) ? ¿Portable (venv reconstruido) ? ¿Entregado (CI en verde, secretos fuera del código) ? Si un no, corrijo antes de entregar. »
Modelo copiar-pegar — función limpia (return, valor inmutable, pathlib)
from pathlib import Path
def charger_lignes(chemin: Path, lignes: list[str] | None = None) -> list[str]:
lignes = [] if lignes is None else list(lignes)
with chemin.open("r", encoding="utf-8") as f:
lignes.extend(line.strip() for line in f)
return lignes
TPE / presupuesto pequeño
Un solo hábito por trimestre basta : venv + pruebas primero, el resto después.
Pyme Argel
Adaptar los rituales a los picos y a los desplazamientos : un hueco black + pytest mantenido cada semana.
Remoto / híbrido
La disciplina n.º 1 a distancia : revisiones escritas y CI en verde, incluso para los pequeños correctivos.
Intercultural
Verificar los usos locales en lugar de suponer : un formato CSV inhabitual debe alertar en todas partes.
Desafío 48h — aplica mañana
Pasa tu script principal por la criba : cero except desnudo, cero .venv versionado, cero secreto en claro. Corrige la primera diferencia encontrada.
- Conozco los 10 reflejos a hacer y las 10 trampas a evitar.
- Verifiqué mis 3 puntos críticos (except, venv, secretos).
- Hice el desafío 48h o planifiqué su fecha.
Antes de entregar, Nabil verifica su práctica. ¿Qué reflejo le protege mejor ?
Pega los criterios del proyecto hilo en la pared : legible (black), probado (pytest), portable (venv), entregado (CI).