क्या मैं ऑर्ग मोड में दो अलग-अलग कोड ब्लॉक में एक कॉमन कोड ब्लॉक शामिल कर सकता हूं?


12

मेरे पास org-modeडेटा की एक तालिका है और इसमें से विभिन्न सारांश निकालने के लिए दो पायथन कोड ब्लॉक हैं।

मैं इन दो कोड ब्लॉक के बीच कुछ सामान्य स्थिरांक और कार्यों को साझा करना चाहता हूं। आदर्श रूप में, मैं सामान्य कोड को एक अलग कोड ब्लॉक में फैक्टरिंग करके ऐसा करूंगा, जो कि जब भी अन्य दो ब्लॉकों का मूल्यांकन किया जाता है, तो स्वचालित रूप से शामिल और मूल्यांकन किया जाएगा। बना-बनाया वाक्य-विन्यास में, यह कुछ इस तरह दिखेगा:

#+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इसे अपडेट करने के लिए हिट कर सकता हूं ।

क्या ऐसा करने का कोई अच्छा तरीका है?

जवाबों:


15

आप साक्षर प्रोग्रामिंग के लिए org-babel के Noweb संदर्भ सिंटैक्स का उपयोग करके यह सबसे आसानी से कर सकते हैं । यहाँ एक उदाहरण है:

* 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

धन्यवाद। यह मेरे hackish समाधान की तुलना में बहुत अच्छा लग रहा है। मैं अगले कुछ दिनों में इसका प्रयास करूंगा और देखूंगा कि मुझे कोई समस्या है या नहीं।
जॉन ओ।

@JonO। यदि यह उत्तर आपके लिए काम करता है तो क्या आप इसे सही
पदावनत

4

थोड़ा और सोचने के बाद मुझे इस समस्या का आंशिक समाधान मिला। यह उपयोग करता है :session, लेकिन मैं कम से कम यह सुनिश्चित कर सकता हूं कि किसी अन्य ब्लॉक का मूल्यांकन करने से पहले सामान्य आरंभ कोड हमेशा स्वचालित रूप से चलाया जाए। 'ट्रिक' एक डमी हेडर वैरिएबल का उपयोग करना है जो हेडर ब्लॉक को संदर्भित करता है, जिससे इसे हर बार मूल्यांकन किया जा सकता है:

#+NAME: init_block
#+BEGIN_SRC python :session t
  constant=19
  def some_function(x):
    return constant * x
#+END_SRC

#+BEGIN_SRC python :session t :var dummy=init_block
some_function(13)
#+END_SRC

#+RESULTS:
: 247

अब मैं परिभाषाओं में बदलाव कर सकता हूं init_blockऔर जब भी कोई अन्य ब्लॉक जिसका उपयोग करता है उसका :var dummy=init_blockमूल्यांकन किया जाता है, तो उनका स्वचालित रूप से पुनर्मूल्यांकन किया जाता है। यह अच्छी तरह से काम करता है बशर्ते कि परिभाषाएँ init_blockउदासीन और स्टेटलेस हैं।

(ध्यान दें कि जब पायथन ब्लॉक को :sessionमोड में बदलना है तो आपको किसी भी returnस्टेटमेंट को हटाना होगा , जिसे ब्लॉक से मान वापस करने के लिए कार्यात्मक मोड में आवश्यक है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.