2013-02-19 17 views
7

HighLine ist eine Ruby-Bibliothek zum Erleichtern der Konsoleneingabe und -ausgabe. Es stellt Methoden bereit, mit denen Sie Eingaben anfordern und validieren können. Gibt es etwas, das ähnliche Funktionen wie in Python bietet?Gibt es ein Python-Pendant zu HighLine?

Um zu zeigen, was Highline das folgende Beispiel sieht:

require 'highline/import' 

input = ask("Yes or no? ") do |q| 
    q.responses[:not_valid] = "Answer y or n for yes or no" 
    q.default = 'y' 
    q.validate = /\A[yn]\Z/i 
end 

Es fragt: „Ja oder nein?“ Und läßt die etwas Benutzereingabe. Solange der Benutzer weder y noch n (Groß-/Kleinschreibung) eingibt, gibt er "Antwort y oder n für Ja oder Nein" aus und lässt den Benutzer eine Antwort erneut eingeben. Wenn der Benutzer die Eingabetaste drückt, wird standardmäßig y angezeigt. Schließlich, wenn es fertig ist, wird die Eingabe in input gespeichert. Hier ist ein Beispielergebnis, bei dem der Benutzer zuerst "EH ???" und dann "y":

 
Yes or no? |y| EH??? 
Answer y or n for yes or no 
? y 

Gibt es ähnlich einfache Möglichkeit, das gleiche in Python zu tun?

+0

Es sieht nicht so schwierig aus, es zu implementieren. Es ist nur eine Regex. Siehe das Modul "re" (http://docs.python.org/2/library/re.html). – Bakuriu

+0

Ihr genaues Beispiel in Python ist verfügbar auf [Sergii Boikos Github] (https://github.com/cris/ruby-quiz-in-python/blob/master/src/highline.py) –

+0

@BurhanKhalid Wenn es antwortet Frage, die Sie vielleicht in Antwort beantworten möchten. –

Antwort

3

Sie können die 3-Modul Python verwenden cliask. Das Modul wurde von the answer of IT Ninja inspiriert, korrigiert some deficiencies in it und ermöglicht die Validierung über eine Regex, ein Prädikat, ein Tupel oder eine Liste.

Der einfachste Weg, um das Modul zu bekommen, ist es über pip zu installieren (die readme für andere Möglichkeiten der Installation sehen):

sudo pip install cliask 

Anschließend können Sie das Modul verwenden, indem Sie wie im folgenden Beispiel importieren:

import cliask 

yn = cliask.agree('Yes or no? ', 
        default='y') 
animal = cliask.ask('Cow or cat? ', 
        validator=('cow', 'cat'), 
        invalid_response='You must say cow or cat') 

print(yn) 
print(animal) 

Und hier ist wie eine Sitzung aussehen könnte, wenn das Beispiel ausgeführt wird:

 
Yes or no? |y| EH??? 
Please enter "yes" or "no" 
Yes or no? |y| y 
Cow or cat? rabbit 
You must say cow or cat 
Cow or cat? cat 
True 
cat 
+0

Schön! Ich schlage diesen Vorschlag sehr über meinen vor, ich war mehr oder weniger nur ein einfaches Beispiel dafür, wie Sie dies erläutern könnten. –

3

Die folgenden sollten ähnlich für Sie arbeiten, obwohl es nicht genau die gleiche Art zu fragen sein wird, wie es in Ruby ist.

class ValidInput(object): 
    def __init__(self,prompt,default="",regex_validate="", 
      invalid_response="",correct_response=""): 
     self.prompt=prompt 
     self.default=default 
     self.regex_validate=regex_validate 
     self.invalid_response=invalid_response 
     self.correct_response=correct_response 
    def ask(self): 
     fin="" 
     while True: 
      v_in=raw_input(self.prompt) 
      if re.match(v_in,self.regex_validate): 
       fin=v_in 
       print self.correct_response 
       break 
      else: 
       print self.invalid_response 
       if self.default=="break": 
         break 
       continue 
     return fin 

Und Sie würden es gerne nutzen:

my_input=ValidInput("My prompt (Y/N): ",regex_validate="your regex matching string here", 
        invalid_response="The response to be printed when it does not match the regex", 
        correct_response="The response to be printed when it is matched to the regex.") 

my_input.ask() 
+0

Sie scheinen "Import Re" vergessen zu haben. Ist das "Fortfahren" notwendig? Warum hast du 'print self.invalid_response' vor' if self.default == "break": \ break? Aus welchem ​​Grund hast du Python 3 nicht benutzt? –

+0

Warum verwenden Sie 're.match' und nicht' re.search' (das vorherige [passt nur zum ersten Zeichen einer Zeichenfolge] (http://docs.python.org/3/library/re.html#search -vs-Übereinstimmung))? Auch scheinen Sie die Parameter in 're.match' in der falschen Reihenfolge platziert zu haben. Außerdem glaube ich nicht, dass es gerechtfertigt ist, einen Kurs zu machen, wenn ein Modul es tut. Vor allem, wenn ein Modul die Semantik vereinfachen wird. Außerdem funktioniert der Standardmechanismus für Ihre Implementierung nicht. Außerdem wird correct_response nicht benötigt. Um das alles zu beheben, habe ich [eine Antwort] gepostet (http://stackoverflow.com/a/14977144/789593). –

Verwandte Themen