У меня есть org-mode
файл, содержащий таблицу данных и два блока кода Python для извлечения различных сводок из него.
Я хотел бы поделиться некоторыми общими константами и функциями между этими двумя блоками кода. В идеале я бы сделал это, выделив общий код в отдельный кодовый блок, который будет автоматически включаться и оцениваться всякий раз, когда оценивается любой из двух других блоков. В вымышленном синтаксисе это будет выглядеть примерно так:
#+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
Я полагаю, я мог бы использовать эту :session
опцию, но я бы предпочел не делать этого по двум причинам. Во-первых, он устанавливает систему с состоянием, а не систему, которая запускается с нуля каждый раз, когда я использую C-c C-c
кодовый блок. Во-вторых, и теперь я должен помнить, что каждый раз, когда открываю файл, вручную оцениваю общий код инициализации: я не могу просто обновить таблицу данных, перейти к одному из сводных блоков и нажать, C-c C-c
чтобы обновить его.
Есть ли хороший способ сделать это?
Подумав еще немного, я нашел частичное решение этой проблемы. Он использует
:session
, но я могу по крайней мере убедиться, что общий код инициализации всегда запускается автоматически, прежде чем оценивать один из других блоков. «Хитрость» состоит в том, чтобы использовать фиктивную переменную заголовка, которая ссылается на блок заголовка, вызывая ее оценку каждый раз:Теперь я могу изменить определения
init_block
и сделать так, чтобы они автоматически переоценивались всякий раз, когда оценивается другой блок, который ссылается на него:var dummy=init_block
. Это хорошо работает при условии, что определенияinit_block
являются идемпотентными и не имеют состояний.(Обратите внимание, что при переходе блоков Python в
:session
режим вы должны удалить всеreturn
операторы, которые необходимы в функциональном режиме для возврата значения из блока).источник