Mi plantilla personalizada para proyectos Python

Python, como el lenguaje pragmático que es, no exige mucho para empezar. Un archivo de texto con código válido, que por convención lleva la extensión .py y constituye un "módulo" en la jerga pythónica, ya es un pequeño programa (un script); lo ejecutamos con python <archivo> y a cobrar. Pero cuando esa simple pieza de código necesita crecer a más archivos o merece ser distribuida, quizás porque será dependencia de otro proyecto o simplemente porque consideramos que a alguien le servirá, entonces necesita algo de estructura y metadatos.

Esto no es algo exclusivo de Python: cuando se comienza un proyecto de software siempre hay una serie de archivos y estructuras básicas que sirven como punto de partida; el conjunto mínimo de archivos y carpetas, configuraciones y código "básico" que se necesita cuando se desea compartir el código como una aplicación o biblioteca: el boilerplate de un proyecto. El boilerplate no define lógica, pero sí establece la base técnica, muchas veces basada en convenciones y otras en gustos personales, sobre la cual se construirá todo lo demás.

Este artículo detalla las decisiones que hice para la plantilla e inicialización automatizada (el "bootstrapping") que uso para mis proyectos, basada en la herramienta Copier.

Si querés probar, la plantilla está en mgaitan/python-package-copier-template y podés crear un proyecto nuevo a partir de ella así:

uvx --with=copier-template-extensions copier copy --trust "gh:mgaitan/python-package-copier-template" /path/to/your/new/project

Lo destacado:

  • 🐍 Paquete Python moderno (+3.12) con configuración centralizada en pyproject.toml.
  • 📦 Build y gestión de dependencias con uv, distinguidas por grupos (dev/qa/docs).
  • 🧹 Linter y formateado vía Ruff con un conjunto amplio de reglas habilitadas.
  • ✅ Type checking vía ty.
  • 🧪 Tests con pytest, coverage.py y otras extensiones
  • 📚 Documentación con Sphinx, MyST y algunas extensiones, desplegada en GitHub Pages
  • 🤖 Automatización de la creación de proyecto en GitHub vía GitHub CLI
  • ⚙️ Workflow de CI en GitHub Actions
  • 🚀 Workflow para releases automáticos vía Trusted Publishing
  • 🧠 Defaults vía introspección para minimizar las decisiones durante el cuestionario inicial
  • 🛠️ Makefile con algunos atajos para tareas comunes
  • 📄 Generación de documentos genéricos como LICENSE/CODE_OF_CONDUCTS/AGENTS.md, etc.
  • 🌀 Setup inicial del entorno de desarrollo y repositorio git
  • ♻️ Proyectos actualizables con copier update

Y muchos más detalles que me estoy olvidando ahora.

Leer más…

Ampliando el universo Python con Rust

Mi compañera Natalia, entre muchos otros talentos que tiene, es traductora de alemán a español y además de traducir de manera independiente, es investigadora y docente en la Universidad Nacional de Córdoba.

Probablemente porque a mí los idiomas me resultan un desafío casi tan infranqueable como el baile o el canto (perdonen los y las colegas que han tenido y tendrán que lidiar mi inglés oral) le tengo una profunda admiración a las personas que saben muchos idiomas, pero no en la mera habilidad de reemplazar unas palabras por otras o producir más sonidos vocales, sino el de conocer y sentir en lo más profundo los distintos universos. Es el sentido en el que Borges se quejaba de una mala traducción que le hicieron:

De acuerdo a los diccionarios, los idiomas son repertorios de sinónimos, pero no lo son. Los diccionarios bilingües hacen creer que cada palabra de un idioma puede ser reemplazada por otra de otro idioma. El error consiste en que no se tiene en cuenta que cada idioma es un modo de sentir el universo.

Esta admiración por el poliglotismo como forma de ensanchar el universo vital yo la extrapolo a las personas que saben muchos lenguajes de programación de manera profunda. Son las personas que traen ideas de un universo a otro y rompen las burbujas, los prejuicios, las ignorancias. Son quienes proponen nuevas formas y límites, toman lo de aquí como inspiración para lo de allá. Sin dudas no existiría Python sin este tipo de personas. Vivan estos "Marco Polo" que conectan universos.

Como estoy con la ambición (pero no la dedicación suficiente) de abrirme una ventanita al universo Rust, suplo mi lentitud y dispersión con herramientas y atajos.

He aquí una manera sencilla de ampliar mi universo (Python) con un "Marco Polo" que conoce el mundo Rust y puede abrirnos una ventana a ese otro universo lleno de posibilidades.

Leer más…

Cómo usar WhisperX en Google Colab (2025)

WhisperX es un pipeline avanzado de reconocimiento de voz construida sobre Whisper, el modelo ASR de código abierto de OpenAI. Funciona en PyTorch y, aunque puede operar sobre CPU, el rendimiento mejora muchísimo con una GPU compatible con CUDA (es decir, NVIDIA). WhisperX mejora al modelo original con una alineación más precisa y veloz, soporte para modelos más grandes y diferenciación de voces (diarización) opcional. El resultado son transcripciones de alta calidad con marcas de tiempo a nivel de palabra e identificación clara de cada hablante y asegura ser hasta 70x más rápìdo que el modelo original

Mi compu no tiene una GPU con soporte para CUDA, así que ejecuto WhisperX en Google Colab y este es un tutorial corto de cómo lo configuro y uso en ese entorno en la nube.

Leer más…

textual-tetris, un tetris en la terminal

Como sigo sin empleo priorizando la búsqueda de salud mental, dedico mi tiempo ñoño a dos loables tareas:

  1. Colaborar con organizaciones que necesitan soluciones tecnológicas pero no tienen el presupuesto para competir con el mercado por mis conocimientos.
  2. La que compete a este post: aprender cosas nuevas implementando ideas viejas del TO DO permanente que anoto acá), para las que rara vez encontraba el tiempo.

Esta vez quería aprender un poco sobre Textual (hermano mayor de rich), el gran framework en Python para hacer interfaces gráficas basadas en texto, las famosas TUIs.

Y ya que estaba, aprendí a hacer un Tetris que es bastante digno de jugar, no se ve taaan feo, y actualmente tiene menos de 600 líneas contando los comentarios y se ve así:

Pero una probadita vale más que mil capturas: abrí una terminal y si tenés uv instalado (¡deberías!) ejecutá:

uvx textual-tetris 

Y ya estás jugando Tetris!

Leer más…

Analizando la migración intraprovincial en Córdoba

Charlando hace poco con Facundo Cruz, sociólogo investigador del Equipo de Investigación Política de la Revista Crisis (EdIPo), le conté sobre un estudio "en joda" que hice una vez, el padronazo cordobés, y recordé un trabajo más útil que supimos hacer desde Open Data Córdoba y que suele ser un tema de interés en la prensa local: analizar migraciones dentro de la provincia de Córdoba basado en los cambios de domicilio, según los padrones electorales. Como Facu se emocionó cuando le explicaba, le prometí que, si me conseguía el último padrón, se lo actualizaría. Así que empecemos por el final. Quedó así:

Leer más…