조직 모드에서 두 개의 다른 코드 블록에 공통 코드 블록을 포함시킬 수 있습니까?


12

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.

이렇게하는 좋은 방법이 있습니까?

답변:


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

감사합니다. 이것은 내 해시 솔루션보다 훨씬 좋아 보입니다. 다음 며칠 내에 사용해보고 문제가 있는지 확인하겠습니다.
Jon O.

@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가 dem 등원이고 무국적 인 경우 잘 작동합니다 .

(파이썬 블록을 :session모드로 변경할 때는 return기능 모드에서 블록에서 값을 반환하는 데 필요한 명령문 을 제거해야 합니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.