Eu tenho um org-mode
arquivo contendo uma tabela de dados e dois blocos de código Python para extrair diferentes resumos dele.
Eu gostaria de compartilhar algumas constantes e funções comuns entre esses dois blocos de código. Idealmente, eu faria isso fatorando o código comum em um bloco de código separado, que seria automaticamente incluído e avaliado sempre que qualquer um dos outros dois blocos fosse avaliado. Na sintaxe inventada, seria algo como o seguinte:
#+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
Suponho que poderia usar a :session
opção, mas preferiria não, por dois motivos. Primeiro, ele configura um sistema com estado, em vez de um que roda do zero toda vez que uso C-c C-c
em um bloco de código. Segundo, e relacionado, agora tenho que me lembrar de avaliar manualmente o código de inicialização comum cada vez que abro o arquivo: não posso apenas atualizar a tabela de dados, ir a um dos blocos de resumo e pressionar C-c C-c
para atualizá-lo.
Existe uma boa maneira de fazer isso?
Depois de pensar um pouco mais, encontrei uma solução parcial para esse problema. Ele usa
:session
, mas posso pelo menos garantir que o código de inicialização comum seja sempre executado automaticamente antes de avaliar um dos outros blocos. O 'truque' é usar uma variável de cabeçalho fictícia que se refere ao bloco de cabeçalho, fazendo com que ela seja avaliada toda vez:Agora eu posso alterar as definições
init_block
e tê-las automaticamente reavaliadas sempre que outro bloco que se refere a ele:var dummy=init_block
é avaliado. Isso funciona bem, desde que as definições eminit_block
sejam idempotentes e sem estado.(Observe que ao alterar os blocos Python para o
:session
modo, você deve remover quaisquerreturn
instruções necessárias no modo funcional para retornar um valor do bloco).fonte