2 min de lectura

IceCream hace que depurar con print() en Python sea menos doloroso

La biblioteca IceCream para Python reemplaza llamadas directas a print() por ic(), mostrando expresiones y valores juntos con contexto opcional de archivo y línea.

Imagen: Hacker News

IceCream es una pequeña biblioteca de depuración para Python construida en torno a una idea: sustituir print() por ic() y obtener una salida más útil con menos tecleo. El proyecto, mantenido por Jakeroid (Ivan Karabadzhak) con el apoyo del equipo de confidential computing en 🌖 Lunal, está dirigido a Python 3 y PyPy3.

En lugar de limitarse a imprimir un valor, ic() muestra tanto la expresión como el resultado. En el ejemplo del proyecto, ic(foo(123)) produce ic| foo(123): 456. Lo mismo ocurre con búsquedas en diccionarios y atributos de clases, lo que facilita la inspección rápida sin tener que etiquetar manualmente cada sentencia print.

Si se llama sin argumentos, ic() cambia de función y reporta el contexto de ejecución: nombre de archivo, número de línea y función padre. Eso resulta útil para trazar rutas de ejecución cuando, de otro modo, dispersarías sentencias print numeradas por una función.

Un detalle práctico es que ic() devuelve su argumento o argumentos, por lo que puede insertarse en expresiones existentes sin cambiar el flujo del programa. La biblioteca también incluye *ic.format(args) para devolver la salida de depuración formateada como una cadena en lugar de enviarla a stderr, además de ic.disable() y ic.enable()** para desactivar y activar la salida sin romper el código.

Recomendado

Waze añade un enrutamiento más inteligente y un modo de voz más silencioso

Configuración de salida e importaciones

IceCream expone una amplia API configureOutput, que incluye:

  • cadenas de prefijo personalizadas o funciones
  • una outputFunction personalizada
  • una argToStringFunction personalizada
  • includeContext opcional
  • contextAbsPath opcional

La conversión de cadena predeterminada usa pprint.pformat(), pero el proyecto también admite formateo específico por clase mediante functools.singledispatch. La documentación muestra esto con un formateador para NumPy ndarray que resume shape y dtype antes de volver al comportamiento normal.

También existe un helper install() que añade ic() a los builtins de Python para que pueda usarse en archivos importados sin importar repetidos, y un uninstall() como contraparte. Para entornos de producción donde IceCream puede no estar instalado, el proyecto sugiere un fragmento try/except ImportError de reserva que convierte ic en una operación no operativa (no-op) mientras preserva los valores de retorno.

La instalación es sencilla: pip install icecream. El proyecto también señala que ic() depende de la librería executing de @alexmojaki para localizar los puntos de llamada en el código fuente, y enumera puertos en otros lenguajes que incluyen Dart, Rust, Node.js, C++, C99, PHP, Go, Ruby, Java, R, Lua, Clojure(Script), Bash, SystemVerilog y GameMaker Language.

Tomas Berg

Computing Editor

Tomas lives in the terminal. He covers chips, laptops, and operating systems with a focus on performance and efficiency. He reads kernel changelogs the way other people read fiction, and he's always on the hunt for the perfect mechanical keyboard switch. If it processes data, Tomas has an opinion on it.

vía Hacker News

// Sigue leyendo