组织模式Babel-Python中的交互式代码块评估


12

这个问题类似,我想评估(以组织模式)包含“输入”指令的Python源代码块,但是我找不到在评估过程中进行交互式评估(带有用户输入)或提供一些已知输入的方法预先存储(例如存储在文件中)。

我的约束是明确使用input说明,因为所有这些都应包括在学生的教科书中。

代码示例:

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

是否有可能进行这样的交互式评估或进行模拟(通过向源代码提供伪输入)?


您会使用组织模式export将学生的示例代码生成为其他格式,例如html吗?
Melioratus

Python的input()函数仅在单行上使用带引号的文本,例如“ hello”或“ hi \ nhello \ nhowdy”,对吗?
Melioratus

@Melioratus Thaks为您发表评论;是的,我使用组织模式导出(到LaTeX / pdf),并且同时导出代码和结果。您还可以使用多行(“”“ ...”“”)文本作为输入函数的参数。我的问题是在代码执行期间将值引入“输入”功能。
Lgen

感谢您的澄清!我将发布一个使用识字编程功能(即noweborg-mode)的答案,该功能将允许您测试并导出带有结果的代码。
Melioratus

谢谢,这可以替代John Kitchin提出的解决方案(可以避免缠结步骤?)。
Lgen'9

Answers:


8

这是使用未导出的缠结文件替换输入函数的替代方法。

#+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: 

提示:按下C-cC-vt或使用该M-xorg-babel-tangle命令创建,即纠结,该example1.py文件。


#+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

注意:example1.py从前一个python SRC块创建的文件将使用内置的:preamble标头和value 导入到当前块中from example1 import *


非常有趣的解决方案,谢谢。我接受它作为解决方案,并且我还将提出一个基于python生成器的变体,并系统地返回一个“ str”对象来模仿input(...)函数。
Lgen

8

python在组织模式下使用读写编程来评估代码块。

使用:var标头分配变量并测试您的代码。

注意:如果需要使用,elisp (read-string "Prompt: ")(read-number "Prompt: ")在emacs中提示用户输入。


范例1- 列印(a)

  • 分配hello worlda


    #+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
    

示例2- print(a + b)

  • 分配1a

  • 分配2b


    #+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
    

示例3- print(a,b,c)

  • 当提示您Value of a输入Thanks
  • 当提示您Value of b输入时4
  • 当提示您Value of c输入时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
    

导出组织文件时,输出应类似于以下示例


范例1- print(a)

  • 分配hello worlda

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

示例2- print(a + b)

  • 分配1a
  • 分配2b

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

示例3- print(a,b,c)

  • 当提示您Value of a输入Thanks
  • 当提示您Value of b输入时4
  • 当提示您Value of c输入时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
    


该代码已在
GNU Emacs 24.5.1(x86_64-unknown-cygwin,GTK +版本3.14.13)
组织模式版本:8.3.2
和github中进行了测试。


非常有趣的解决方案;我花了一些时间来理解(我不习惯于编程),第二个python源块中的指令(例如a = input('a的值))仅是文档文本,并未被视为指令。
Lgen

@Lgen-谢谢!具有noweb组织模式功能的识字编程非常棒,而且非常有用!如果您需要其他代码示例,请告诉我。如果您需要的内容与问答格式不符,我很高兴将其发布到我的GitHub存储库中。
Melioratus

6

我认为不可能通过org-babel获得真正的交互式Python输入。

您可以使用前导来重新定义输入函数,以便它返回您想要模拟输入使用的内容,例如,在这里我们使它看起来像用户在“ 3”中键入的内容。

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

#+RESULTS:
: 3

根据学生看到的内容,他们可能看不到您已经完成了此操作。


感谢约翰为您提出的答案。我想知道是否有可能将其扩展到代码块中对输入函数的多次调用(例如a = input(“ a的值”)b = input(“ b的值”))。为了构建texbook,我通常在“#+ BEGIN_SRC python”语句中使用和“:export both”,因此在导出的文本中该行不可见。
Lgen

如果使用会话,则有可能:#+ BEGIN_SRC python:session:exports none def input(x):如果x =='a的值:return 3 elif x =='b的值':return 4# + END_SRC#+结果:#+ BEGIN_SRC python:结果输出:会话a =输入('a的值')b =输入('b的值)print(a + b)#+ END_SRC#+结果::: >>> >>> 7
约翰·基钦

2

作为John Kitchin解决方案的补充,我建议使用生成器来提供将“馈送” input(...)函数并str系统地返回对象的连续值。

#+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 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.