Ich habe eine org-mode
Datei mit einer Datentabelle und zwei Python-Codeblöcken, um verschiedene Zusammenfassungen daraus zu extrahieren.
Ich möchte einige gemeinsame Konstanten und Funktionen zwischen diesen beiden Codeblöcken teilen. Im Idealfall würde ich dazu den gemeinsamen Code in einen separaten Codeblock zerlegen, der automatisch einbezogen und ausgewertet wird, wenn einer der beiden anderen Blöcke ausgewertet wird. In der erfundenen Syntax würde es ungefähr so aussehen:
#+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
Ich nehme an, ich könnte die :session
Option nutzen, würde es aber aus zwei Gründen vorziehen, nicht zu tun. Erstens wird ein statusbehaftetes System eingerichtet und nicht ein System, das jedes Mal neu gestartet wird, wenn ich C-c C-c
einen Codeblock verwende. Zweitens und damit verbunden muss ich jetzt daran denken, den gemeinsamen Initialisierungscode bei jedem Öffnen der Datei manuell auszuwerten: Ich kann nicht einfach die Datentabelle C-c C-c
aktualisieren, sondern in einen der Zusammenfassungsblöcke gehen und auf klicken, um ihn zu aktualisieren.
Gibt es eine gute Möglichkeit, dies zu tun?
Nachdem ich ein wenig nachgedacht hatte, fand ich eine Teillösung für dieses Problem. Es funktioniert
:session
, aber ich kann zumindest sicherstellen, dass der gemeinsame Initialisierungscode immer automatisch ausgeführt wird, bevor einer der anderen Blöcke ausgewertet wird. Der 'Trick' besteht darin, eine Dummy-Header-Variable zu verwenden, die auf den Header-Block verweist und ihn jedes Mal auswertet:Jetzt kann ich Definitionen ändern
init_block
und sie automatisch neu auswerten lassen, wenn ein anderer Block ausgewertet wird, der auf die Verwendung von verweist:var dummy=init_block
. Dies funktioniert gut, sofern die Definitionen ininit_block
idempotent und zustandslos sind.(Beachten Sie, dass Sie beim Ändern von Python-Blöcken in den
:session
Modus allereturn
Anweisungen entfernen müssen , die im Funktionsmodus erforderlich sind, um einen Wert aus dem Block zurückzugeben.)quelle