Org Mode Babel - Đánh giá khối mã tương tác trong Python


12

Tương tự như câu hỏi này, tôi muốn đánh giá (ở chế độ org) Các khối mã nguồn Python chứa các hướng dẫn "đầu vào" nhưng tôi không thể tìm cách đánh giá tương tác (với đầu vào của người dùng) trong khi đánh giá hoặc cung cấp cho nó một số đầu vào trước (được lưu trữ trong một tập tin chẳng hạn).

Hạn chế của tôi là sử dụng inputhướng dẫn một cách rõ ràng vì tất cả những điều này nên được đưa vào sách giáo khoa cho học sinh.

Ví dụ về mã:

#+BEGIN_SRC python :results output 
a= input("Value") 
print(a)
#+END_SRC

Có thể có một đánh giá tương tác như vậy hoặc mô phỏng nó (bằng cách cung cấp cho mã nguồn một đầu vào giả)?


Bạn sẽ sử dụng chế độ org exportđể tạo mã ví dụ cho sinh viên sang một số định dạng khác, ví dụ html?
Melioratus

Hàm input () của Python chỉ lấy văn bản được trích dẫn trên một dòng, ví dụ: "xin chào" hoặc "hi \ nhello \ nhowdy", đúng không?
Melioratus

@Melioratus Thaks cho bạn ý kiến; có, tôi sử dụng xuất chế độ org (sang LaTeX / pdf) và tôi xuất cả mã và kết quả. Bạn cũng có thể sử dụng văn bản multilines ("" "..." "") làm tham số cho chức năng nhập. Vấn đề của tôi là giới thiệu các giá trị cho hàm "đầu vào" trong quá trình thực thi mã.
Lgen

Cảm ơn bạn đã làm rõ! Tôi sẽ đăng câu trả lời sử dụng các tính năng lập trình biết chữ, tức là nowebở chế độ org sẽ cho phép bạn kiểm tra và xuất mã của bạn với kết quả.
Melioratus

Cảm ơn, đây có thể là một giải pháp thay thế cho giải pháp được đề xuất bởi John Kitchin (có thể tránh được bước rối?).
Lgen

Câu trả lời:


8

Dưới đây là một cách tiếp cận khác sử dụng tệp không xuất, rối để thay thế chức năng nhập.

#+BEGIN_SRC python :session :exports none :tangle example1.py
def input(x): 
    if x == 'Value of a':
        return 3
    elif x == 'Value of b':
        return 4 

#+END_SRC 

#+RESULTS: 

Mẹo: Nhấn C-cC-vthoặc sử dụng M-xorg-babel-tanglelệnh để tạo, tức là rối , example1.pytệp.


#+BEGIN_SRC python :results output :preamble from example1 import *
a = input('Value of a')
b = input('Value of b')
print(a + b) 
#+END_SRC 

#+RESULTS:
: 7

Lưu ý: Các example1.pytập tin được tạo ra từ python trước SRCkhối sẽ được nhập vào khối hiện tại bằng cách sử dụng được xây dựng trong : lời mở đầu tiêu đề và giá trị from example1 import *.


Giải pháp rất thú vị, cảm ơn. Tôi chấp nhận nó như một giải pháp và tôi cũng sẽ đề xuất một biến thể dựa trên trình tạo python và trả lại một cách có hệ thống một đối tượng "str" ​​để bắt chước hàm đầu vào (...).
Lgen

8

Đánh giá pythoncác khối mã bằng cách sử dụng lập trình biết chữ trong chế độ org.

Sử dụng :vartiêu đề để gán biến và kiểm tra mã của bạn.

Lưu ý: Nếu muốn sử dụng elisp (read-string "Prompt: ")(read-number "Prompt: ")nhắc nhở người dùng nhập vào bên trong emacs.


Ví dụ 1 - in (a)

  • Chỉ định hello worldcho a.


    #+name: ex1-code  
    #+header: :var a="hello world"  
    #+begin_src python :results verbatim replace output :exports results  
      print(a)  
    #+end_src
    
    #+begin_src python :eval never :exports code :noweb yes   
      a = input('Value of a')  
      <<ex1-code>>  
    #+end_src  
    
    #+results: ex1-code
    : hello world
    

Ví dụ 2 - print(a + b)

  • Chỉ định 1cho a.

  • Chỉ định 2cho b.


    #+name: ex2-code
    #+header: :var a=1 
    #+header: :var b=2 
    #+begin_src python :results replace output  :exports results 
      print(a + b)
    #+end_src
    
    #+begin_src python :eval never :exports code :noweb yes 
      a = input('Value of a')
      b = input('Value of b')
      <<ex2-code>>
    #+end_src  
    
    #+results: ex2-code
    : 3
    

Ví dụ 3 - print(a,b,c)

  • Khi được nhắc Value of anhậpThanks
  • Khi được nhắc Value of bnhập 4.
  • Khi được nhắc Value of cnhập your question.


    #+NAME: ex3-code
    #+header: :var a=(read-string "Value of a ") 
    #+header: :var b=(read-number "Value of b ") 
    #+header: :var c=(read-string "Value of c ") 
    #+begin_src python :results replace output   :exports results 
      print a,b,c
    #+end_src  
    
    #+begin_src python :eval never :exports code :noweb yes 
      a = input('Value of a')
      b = input('Value of b')
      c = input('Value of c')
      <<ex3-code>>
    #+end_src  
    
    #+results: ex3-code
    : Thanks 4 your question
    

Khi bạn xuất tệp org của mình, đầu ra sẽ trông giống như ví dụ bên dưới


Ví dụ 1 - print(a)

  • Chỉ định hello worldcho a.

    a = input('Value of a')
    print(a)
    
    hello world
    

Ví dụ 2 - print(a + b)

  • Chỉ định 1cho a.
  • Chỉ định 2cho b.

    a = input('Value of a')
    b = input('Value of b')
    print(a + b)
    
    3
    

Ví dụ 3 - print(a,b,c)

  • Khi được nhắc Value of anhậpThanks
  • Khi được nhắc Value of bnhập 4.
  • Khi được nhắc Value of cnhập your question.

    a = input('Value of a')
    b = input('Value of b')
    c = input('Value of c')
    print a,b,c
    
    Thanks 4 your question
    


Mã này đã được thử nghiệm với
GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + Phiên bản 3.14.13)
Org-Mode Phiên bản: 8.3.2
và github.


Giải pháp rất thú vị; tôi phải mất thời gian để hiểu (tôi không quen biết lập trình) rằng các hướng dẫn trong khối nguồn python thứ hai (ví dụ a = input ('Giá trị của a')) chỉ là văn bản tài liệu và không được coi là hướng dẫn.
Lgen

@Lgen - Cảm ơn! Các chương trình biết chữ noweb, trong các tính năng chế độ org là tuyệt vời và vô cùng hữu ích! Xin vui lòng cho tôi biết nếu bạn muốn các ví dụ mã bổ sung. Nếu bạn cần một cái gì đó không phù hợp với định dạng Q & A, tôi rất vui lòng đăng lên kho GitHub của tôi.
Melioratus

6

Tôi không nghĩ có thể có được đầu vào Python tương tác thực sự với org-babel.

Bạn có thể sử dụng một lời mở đầu để xác định lại chức năng đầu vào để nó trả về những gì bạn muốn mô phỏng việc sử dụng đầu vào, ví dụ ở đây chúng tôi làm cho nó trông giống như người dùng nhập vào "3".

#+BEGIN_SRC python :results output :preamble def input(x): return 3
a = input("value ")
print(a)
#+END_SRC

#+RESULTS:
: 3

Tùy thuộc vào những gì sinh viên thấy được xuất khẩu, họ có thể không thấy rằng bạn đã làm điều này.


Cảm ơn John cho bạn đề xuất câu trả lời. Tôi đã tự hỏi nếu có thể mở rộng nó thành nhiều cuộc gọi đến chức năng đầu vào trong khối mã (ví dụ a = input ("Giá trị của a") b = input ("Giá trị của b")). Để xây dựng texbook tôi thường sử dụng và ": export cả hai" trong câu lệnh "# + BEGIN_SRC python" để dòng này không hiển thị trong văn bản đã xuất.
Lgen

Nếu bạn sử dụng phiên, có thể: # + BEGIN_SRC python: session: xuất không có đầu vào def (x): if x == 'Giá trị của a': return 3 elif x == 'Giá trị của b': return 4 # + END_SRC # + KẾT QUẢ: # + BEGIN_SRC python: kết quả đầu ra: session a = input ('Giá trị của a') b = input ('Giá trị của b') print (a + b) # + END_SRC # + KẾT QUẢ :: >>> >>> 7
John Kitchin

2

Để bổ sung cho giải pháp của John Kitchin, tôi đề xuất sử dụng một trình tạo để cung cấp các giá trị liên tiếp sẽ "nuôi" các input(...)chức năng và trả về một strđối tượng một cách có hệ thống.

#+BEGIN_SRC python :session :exports none :tangle example2.py :results none
def generate(lst):
    for element in lst:
        yield str(element)

generator =  generate(["Thanks",4,"your help"])

def input(x):
     return generator.__next__()
#+END_SRC 


#+BEGIN_SRC python :results output :preamble from example2 import * :exports both
a = input('Value of a')
b = input('Value of b')
c = input('Value of c')
print(a,b,c)
#+END_SRC 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.