Viernes 10:00–11:00

Code-cropper: código que genera código más simple

Gervasio Calderón

Audience level:
Intermedia

Descripción

Code-cropper extrae comportamiento de código Python live, generando un programa equivalente reducido a funciones o clases de interés. Puede servir para simplificar un programa, generar Unit-tests, auditoría, mocking, etc. Se usan:

  • metaprogramación

  • formato Json para el grafo de llamadas

  • colas multithreading

  • generación de código

https://github.com/GervasioCalderon/code-cropper/

Resumen

Code Cropper

Introducción

Code-cropper es una herramienta que extrae comportamiento de código Python en ejecución generando un programa equivalente al original pero solamente con las funciones y clases elegidas por el programador. Se utilizan técnicas de metaprogramación para decorar las funciones seleccionadas. Esto puede servir para simplificación del código, generación automática de Unit-tests o Mock-objects, auditoría, etc.

La página de GitHub de la tool es:

Implementación

En el proyecto se usan:

  • librerías de metaprogramación, como inspect y types;
  • formato Json para guardar el grafo de llamadas;
  • colas multithreading, para desacoplar llamadas a la función original del guardado del grafo.

Posibles usos

Con esta herramienta aplicada a un sistema complejo se podría:

  • hacer auditoría: solamente para "loggear" las funciones que se llaman, y con qué parámetros; por ejemplo:
    • anotar una clase que representa una conexión de DB y ver el detalle de las consultas que pasan por ella;
    • anotar <code>os.path.join()</code> para ver (como una simplificación) qué funciones acceden al sistema de archivos.
  • simplificar el código, aislando sólo clases o funciones de interés; idealmente se podría reproducir un bug o un sub-sistema sólo con este subconjunto de clases.
  • detectar errores azarosos o de multithreading: se podría grabar sucesivas corridas, y comparar luego los grafos de llamadas o los códigos equivalentes, para ver qué parametros son los que ocasionan estos errores.
  • generar automáticamente Unit-tests: dado que se guarda qué funciones se llaman y el valor esperado, se puede armar un Unit-Test aproximado; con esta base, hace falta la mano del programador para que las funciones a "testear" y los valores esperados tengan sentido. Pero es una buena aproximación inicial, sobre todo porque automatiza las tareas rutinarias como armar los parámetros de entrada a las funciones.
  • Armar "mock objects": así como se hookea a las clases para que generen un Json con la corrida, también se las podría hookear para que lean de estos Json en una corrida posterior y devuelvan los mismos valores. Esto es una forma casera de obtener "mock objects" (por ejemplo, para cuando es muy costoso llamar a los objetos originales).

Slides

Video