org-mode – ¿Puedo incluir un bloque de código común en dos bloques de código diferentes en el modo Org?

Pregunta:

Tengo un archivo en org-mode que contiene una tabla de datos y dos bloques de código Python para extraer diferentes resúmenes.

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 evaluara cualquiera de los otros dos bloques. En la sintaxis inventada, se vería como lo siguiente:

#+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 opción :session , 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 uso Cc Cc en un bloque de código. En segundo lugar, y de manera relacionada, ahora debo 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 Cc Cc para actualizarlo.

¿Existe una forma correcta de hacer esto?

Respuesta:

Puede hacer esto más fácilmente usando la sintaxis de referencia noweb de org-babel para programación alfabetizada. Aquí hay un ejemplo:

* Initialization block containing function definition
#+NAME: init_block
#+BEGIN_SRC python
  constant=19
  def some_function(x):
    return constant * x
#+END_SRC

* Call the function on an integer
#+BEGIN_SRC python :noweb yes 
  <<init_block>>
  return some_function(13)
#+END_SRC

#+RESULTS:
: 247

* Call the function on a string
:PROPERTIES:
:noweb:    yes
:END:

#+BEGIN_SRC python
  <<init_block>>
  return some_function('abc')
#+END_SRC

#+RESULTS:
: abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım