Orientación de la Base de Código
Cómo leer un repositorio de servicios Python: estructura de carpetas, propiedad, convenciones y el camino más rápido desde la clonación hasta la navegación segura.
Receta
service/
├── src/billing/ # paquete de la aplicación
├── tests/ # refleja la estructura de src
├── alembic/ # migraciones de DB (si se usa SQLAlchemy)
├── pyproject.toml # deps, configuración de ruff, pytest
├── uv.lock # resolución reproducible
├── docs/ # ADRs, onboarding, runbooks
└── .github/workflows/ # fuente de verdad de CICuándo recurrir a esto:
- Primera semana en un nuevo equipo o servicio
- Regreso después de una larga ausencia o reorganización
- Planificación de una refactorización entre módulos
- Revisión de una PR grande fuera de tu área habitual
Ejemplo de Trabajo
# Script de sesión de orientación (30-60 min autoguiado)
tree -L 2 src/ tests/
rg -l "router|Blueprint|urlpatterns" src/ # encontrar puntos de entrada HTTP
cat pyproject.toml | rg "name|requires-python|scripts"
cat docs/adr/0001-*.md 2>/dev/null || ls docs/
gh api repos/:owner/:repo/contents/CODEOWNERS 2>/dev/null || cat CODEOWNERS
uv run pytest --collect-only -q | head # ver módulos de pruebaRastrea una historia de usuario:
- Encuentra el manejador de ruta (
src/billing/api/routes/orders.py). - Sigue la capa de servicio (
services/order_service.py). - Encuentra el repositorio/ORM (
repositories/order_repo.py). - Anota la migración que afecta a la misma tabla (
alembic/versions/).
Lo que esto demuestra:
- La estructura
src/separa el paquete importable de la raíz del repositorio. - La búsqueda por palabras clave del framework localiza rápidamente la superficie HTTP.
- Las ADR y CODEOWNERS responden a "quién decide" y "por qué".
- La recolección de pruebas mapea módulos a contratos de comportamiento.
Inmersión Profunda
Cómo Funciona
- Estructura
src- El paquete bajosrc/<nombre>/evita importaciones accidentales desde la raíz del repositorio enPYTHONPATH. pyproject.toml- Manifiesto único para metadatos, dependencias, configuración de herramientas (ruff, pytest, mypy).- Las pruebas reflejan
src-tests/billing/api/test_orders.pyse mapea asrc/billing/api/orders.py. - Propiedad -
CODEOWNERSsolicita automáticamente a los expertos del dominio en las PRs.
Qué Leer Primero
| Artefacto | Respuestas |
|---|---|
| README | Comandos de inicio rápido |
docs/onboarding.md | Trampas específicas del equipo |
| ADRs | Decisiones de framework y esquema |
| Flujo de CI | Puertas de calidad requeridas |
CONTRIBUTING.md | Reglas de PR y commit |
Notas de Python
# Descubre la versión del paquete y los puntos de entrada programáticamente
import importlib.metadata as m
m.version("billing")
# console_scripts de pyproject [project.scripts]Trampas
- Asumir Django cuando es FastAPI - Patrones de middleware y configuración incorrectos. Solución: leer ADR o la lista de frameworks en
pyproject. - Ignorar rutas de monorepo - Editar la copia incorrecta del servicio. Solución: confirmar la URL remota y el nombre del directorio.
- Variables de entorno no documentadas -
.env.exampleobsoleto. Solución: documentar el error en el primer clave faltante. - Omitir pruebas como especificación - Las pruebas muestran contratos reales mejor que la wiki obsoleta. Solución: leer las pruebas del módulo que tocas.
- Lectura del directorio "big bang" - Abrumador. Solución: rastrear una única "slice" vertical.
- Solo conocimiento tribal - Compañero no disponible más tarde. Solución: capturar respuestas en
docs/onboarding.md.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Wiki de diagramas de arquitectura | Solo alto nivel | Diagrama obsoleto vs código |
pydeps / grafos de importación | Desenredar ciclos | Primera hora en el repositorio |
| IDE de búsqueda de código | Salto de símbolo | Aún no hay clonación local |
| Tour de emparejamiento | Legado complejo | Escala de incorporación autoservicio |
Preguntas Frecuentes
¿Múltiples paquetes en monorepo?
Leer el README raíz para la lista de paquetes; cd services/billing-api por servicio con su propio uv.lock.
¿Dónde está la lógica de negocio?
Los equipos usan la capa services/ o el paquete de dominio; evitar manejadores de ruta "gordos"; buscar class *Service.
¿Código generado?
Comprobar Makefile / scripts/generate - no editar manualmente la salida del cliente OpenAPI.
¿Banderas de funcionalidad (feature flags)?
Buscar settings o la inicialización del SDK de LaunchDarkly - las banderas ocultan rutas incompletas.
¿Librería interna compartida?
Seguir el submódulo git o libs/ del monorepo - tener en cuenta el proceso de actualización de versión separado.
¿Scripts legados/ carpeta?
Puede ser pre-migración de src - el README debería indicar el estado de la migración; preferir src/ para código nuevo.
¿Quién posee la infraestructura/terraform?
CODEOWNERS en infra/ o etiqueta del equipo de plataforma en README.
¿Qué tan actualizadas están las ADRs?
Fecha en el nombre del archivo - si tiene más de 2 años, verificar que sigue siendo válida con un compañero.
¿Diseño de aplicaciones Django?
Cada apps/* es un contexto delimitado - empezar en urls.py y models.py por aplicación.
¿Encontrar tareas de Celery?
rg "@app.task" src/ o lista de inclusión de celery.py.
Relacionado
- Checklist de Onboarding de Desarrolladores - cronograma
- Guía de Convenciones y Estilo - modismos
- Estructura de Diseño y Paquetes
src- arquitectura - Registros de Decisiones de Arquitectura (ADRs) - proceso de ADRs
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.