संगठन मोड बैबेल - पायथन में इंटरएक्टिव कोड ब्लॉक मूल्यांकन


12

करने के लिए इसी तरह इस सवाल का मैं (ऑर्ग मोड में) का मूल्यांकन करना चाहेंगे युक्त "इनपुट" निर्देश अजगर स्रोत कोड ब्लॉक लेकिन मैं मूल्यांकन के दौरान या यह कुछ ज्ञात इनपुट देने के लिए (उपयोगकर्ता इनपुट के साथ) एक इंटरैक्टिव मूल्यांकन करने के लिए एक तरह से नहीं मिल सकता है अग्रिम में (उदाहरण के लिए एक फ़ाइल में संग्रहीत)।

मेरा अवरोध स्पष्ट रूप से inputनिर्देश का उपयोग करना है क्योंकि यह सब छात्रों के लिए एक पाठ्यपुस्तक में शामिल होना चाहिए।

कोड का उदाहरण:

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

क्या इस तरह के संवादात्मक मूल्यांकन करना या इसका अनुकरण करना संभव है (स्रोत कोड को एक नकली इनपुट देकर)?


क्या आप exportछात्रों के लिए अपने उदाहरण कोड को किसी अन्य प्रारूप, जैसे HTML में बनाने के लिए org-mode का उपयोग कर रहे हैं ?
मेलिओराटस

पायथन के इनपुट () फ़ंक्शन केवल सिंगल लाइन पर उद्धृत पाठ लेता है, उदाहरण के लिए "हेलो" या "हाय \ nhello \ nhowdy", सही?
मेलियोराटस

@Melioratus आप टिप्पणी के लिए Thaks; हाँ, मैं ऑर्ग-मोड एक्सपोर्ट (लाटेक्स / पीडीएफ़ के लिए) का उपयोग करता हूं और मैं कोड और परिणाम दोनों का निर्यात करता हूं। आप इनपुट फ़ंक्शन के पैरामीटर के रूप में मल्टीलाइन ("" "..." "") टेक्स्ट का भी उपयोग कर सकते हैं। मेरी समस्या कोड के निष्पादन के दौरान "इनपुट" फ़ंक्शन के मूल्यों को पेश करना है।
Lgen

स्पष्टीकरण के लिए धन्यवाद! मैं एक उत्तर पोस्ट करूंगा जो साक्षर प्रोग्रामिंग सुविधाओं का उपयोग करता है, अर्थात noweb, ऑर्ग-मोड का जो आपको परिणामों के साथ अपने कोड का परीक्षण और निर्यात करने की अनुमति देगा।
Melioratus

धन्यवाद, यह जॉन किचन द्वारा प्रस्तावित समाधान का एक विकल्प हो सकता है (हो सकता है कि पेचीदा कदम से बचा जा सके?)।
लेजन

जवाबों:


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 फ़ाइल पिछले अजगर से बनाया गया था कि SRCब्लॉक वर्तमान ब्लॉक builtin का उपयोग कर में आयात किया जाएगा प्रस्तावना: शीर्षक और मूल्य from example1 import *


बहुत दिलचस्प समाधान, धन्यवाद। मैं इसे समाधान के रूप में स्वीकार करता हूं और मैं अजगर जनरेटर पर आधारित एक संस्करण का प्रस्ताव भी रखूंगा और इनपुट (...) फ़ंक्शन की नकल करने के लिए व्यवस्थित रूप से एक "str" ​​ऑब्जेक्ट लौटाऊंगा।
20

8

pythonOrg- मोड में साक्षर प्रोग्रामिंग का उपयोग करके कोड ब्लॉक का मूल्यांकन करें।

:varवैरिएबल असाइन करने और अपने कोड का परीक्षण करने के लिए हेडर का उपयोग करें ।

नोट: यदि वांछित उपयोग elisp (read-string "Prompt: ")और (read-number "Prompt: ")emacs के अंदर उपयोगकर्ता इनपुट के लिए संकेत देना है।


उदाहरण 1 - प्रिंट (ए)

  • निरुपित hello worldकरने के लिए 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
    

उदाहरण 2 - print(a + b)

  • निरुपित 1करने के लिए a

  • निरुपित 2करने के लिए 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
    

उदाहरण 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
    

जब आप अपनी org फ़ाइल निर्यात करते हैं, तो आउटपुट को नीचे दिए गए उदाहरण के समान दिखना चाहिए


उदाहरण 1 - print(a)

  • निरुपित hello worldकरने के लिए a

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

उदाहरण 2 - print(a + b)

  • निरुपित 1करने के लिए a
  • निरुपित 2करने के लिए b

    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 + Version 3.14.13)
Org-Mode संस्करण: 8.3.2
और github के साथ परीक्षण किया गया था ।


बहुत दिलचस्प समाधान; मुझे समझने में समय लगा (मैं प्रोग्रामिंग को साक्षर करने के लिए उपयोग नहीं किया गया था) कि दूसरे पायथन स्रोत ब्लॉक (उदाहरण = एक इनपुट ('मान')) में निर्देश केवल दस्तावेजीकरण पाठ थे और उन्हें निर्देश के रूप में नहीं माना गया था।
Lgen

@Lgen - धन्यवाद! साक्षर प्रोग्रामिंग, nowebऑर्ग-मोड में अद्भुत और अविश्वसनीय रूप से उपयोगी हैं! कृपया मुझे बताएं कि क्या आप अतिरिक्त कोड उदाहरण चाहेंगे। यदि आपको कोई ऐसी चीज चाहिए जो Q & A प्रारूप में अच्छी तरह से फिट नहीं होती है, तो मुझे अपने GitHub रिपॉजिटरी में पोस्ट करने की खुशी है।
Melioratus

6

मुझे नहीं लगता कि ऑर्गन-बैबेल के साथ वास्तव में इंटरैक्टिव पायथन इनपुट प्राप्त करना संभव है।

आप इनपुट फ़ंक्शन को पुनर्परिभाषित करने के लिए एक प्रस्तावना का उपयोग कर सकते हैं, इसलिए यह इनपुट के उपयोग का अनुकरण करना चाहता है, जैसे कि यहां हम इसे "3" में टाइप किए गए उपयोगकर्ता की तरह दिखते हैं।

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

#+RESULTS:
: 3

यह देखने पर निर्भर करता है कि जो छात्र निर्यात किए गए हैं, वे यह नहीं देख सकते हैं कि आपने ऐसा किया है।


धन्यवाद जॉन आपके लिए प्रस्तावित उत्तर। मैं सोच रहा था कि क्या इसे कोड ब्लॉक में इनपुट फ़ंक्शन के लिए एक मल्टीपल कॉल पर बढ़ाया जा सकता है (उदाहरण के लिए = a (इनपुट "a") b = इनपुट ("b का मान")। आमतौर पर मेरे द्वारा उपयोग की जाने वाली टेक्सबुक और ": एक्सपोर्ट" दोनों को "# + BEGIN_SRC पायथन" स्टेटमेंट में बनाने के लिए इसलिए यह लाइन एक्सपोर्ट किए गए टेक्स्ट में दिखाई नहीं देनी चाहिए।
लेजेन

यदि आप एक सत्र का उपयोग करते हैं, तो यह संभव है: # + BEGIN_SRC अजगर: सत्र: निर्यात कोई भी डीईएफ़ इनपुट (x): यदि x == 'a' का मान: वापसी 3 elif x == 'b का मान': 4 # लौटें : >>> >>> 7
जॉन किचिन

2

जॉन किचन के समाधान के पूरक के रूप में, मैं एक जनरेटर का उपयोग करने का प्रस्ताव करता हूं जो क्रमिक मूल्यों को प्रदान करता है जो 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 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.