Tengo un org-mode
archivo que contiene una tabla de datos y dos bloques de código Python para extraer diferentes resúmenes de él.
Me gustaría compartir algunas constantes y funciones comunes entre estos dos bloques de código. Idealmente, haría esto factorizando el código común en un bloque de código separado, que se incluiría y evaluaría automáticamente cada vez que se evalúe cualquiera de los otros dos bloques. En una sintaxis inventada, se vería algo así:
#+NAME: init_block
#+BEGIN_SRC python
... common constants and functions here ...
#+END_SRC
#+NAME: summary_1
#+BEGIN_SRC python :prepend init_block
... data-processing code depending on init code goes here ...
#+END_SRC
#+NAME: summary_2
#+BEGIN_SRC python :prepend init_block
... more processing which also depends on init code ...
#+END_SRC
Supongo que podría usar la :session
opción, pero preferiría no hacerlo, por dos razones. Primero, configura un sistema con estado, en lugar de uno que se ejecuta desde cero cada vez que lo uso C-c C-c
en un bloque de código. En segundo lugar, y de manera relacionada, ahora tengo que recordar evaluar manualmente el código de inicialización común cada vez que abro el archivo: no puedo simplemente actualizar la tabla de datos, ir a uno de los bloques de resumen y presionar C-c C-c
para actualizarlo.
¿Existe una forma correcta de hacer esto?
Después de pensar un poco más, encontré una solución parcial a este problema. Sí usa
:session
, pero al menos puedo asegurarme de que el código de inicialización común siempre se ejecute automáticamente antes de evaluar uno de los otros bloques. El 'truco' es usar una variable de encabezado ficticio que se refiera al bloque de encabezado, haciendo que se evalúe cada vez:Ahora puedo cambiar las definiciones
init_block
y hacer que se vuelvan a evaluar automáticamente cada vez que se evalúe otro bloque que se refiera a él usando:var dummy=init_block
. Esto funciona bien siempre que las definicionesinit_block
sean idempotentes y sin estado.(Tenga en cuenta que al cambiar los bloques de Python al
:session
modo, debe eliminar todas lasreturn
declaraciones, que son necesarias en el modo funcional para devolver un valor del bloque).fuente