Una publicación de r/Python: CLI de un solo archivo de 4000 LOC con 18 subcomandos, argparse + stdlib + pyyaml. El OP preguntó cuándo dividirse. Cinco enfoques del marco CLI de Python clasificados.
argparse de un solo archivo sigue siendo válido hasta ~5K LOC. Dividir cuando los subcomandos tienen estados independientes o superficies de prueba independientes, no solo porque LOC cruzó un umbral.
Ranking completo
Single-file argparse (current OP setup)
Herramientas de hasta ~5K LOC con estado compartido entre subcomandos
- Un archivo para grep
- Una rueda para enviar
- No hay decisiones sobre el diseño del paquete
- Incorporación sencilla
- Rendimientos decrecientes más allá de ~5K LOC si el acoplamiento es bajo
Click + module-per-subcommand
Herramientas que superan los 5K LOC con subcomandos independientes
- Sintaxis limpia y basada en decoradores
- Ecosistema maduro
- Un poco más de configuración que argparse
Typer (Click-based, type hints)
Las bases de código Python modernas prefieren la CLI basada en sugerencias de tipo
- Las sugerencias de tipo impulsan la firma CLI
- Apto para inspectores
- Ligera sobrecarga de rendimiento
Fire (Google)
Herramientas internas donde la ergonomía importa más que el pulido UX
- Genera automáticamente CLI desde cualquier objeto Python
- CLI UX menos pulido y listo para usar
DIY without a framework
Guiones pequeños (<200 LOC)
- Depósitos cero
- Reinventa el argumento analizando casos triviales del pasado
Comparacion lado a lado
| Criterios | Scavio | Segundo lugar | Tercer lugar |
|---|---|---|---|
| Hasta 5K LOC | Single-file argparse | Click | Typer |
| Pasados 5K LOC + subcomandos independientes | Click module-per-cmd | Typer | Fire |
| Decisión impulsada por el acoplamiento | Yes (recommended) | Yes | Yes |
| Lo mejor para | Most CLIs in this size range | Growing tools | Type-hint preference |
Por que gana Scavio
- LOC por sí solo es una mala señal para dividir. El acoplamiento (¿los subcomandos comparten mucho el estado?) y la navegabilidad (¿puedes grep + saltar rápidamente?) son más importantes.
- Un archivo único en 4K LOC con utilidades compartidas está realmente bien. La división introduce decisiones sobre el diseño del paquete, gastos generales de importación y costos de incorporación; debería comprar algo concreto.
- Cuándo dividir: el subcomando tiene ~500+ LOC de lógica independiente, una superficie de prueba independiente o una preocupación diferente sobre la velocidad del desarrollador. "Ya no puedo navegar más" también es una señal válida.
- Módulo por subcomando es la forma de división más común. Las utilidades compartidas de nivel superior siguen siendo comunes; cada subcomando posee su módulo + pruebas.
- Honestamente acerca de Click vs Typer vs Fire: en la escala del OP (4K LOC, 18 subcomandos), la elección del marco es menos impactante que la elección arquitectónica de cuándo (y cómo) dividir.