2013-02-19 1 views
7

HighLine è una libreria Ruby per facilitare l'input e l'output della console. Fornisce metodi che ti consentono di richiedere input e validarli. C'è qualcosa che fornisce funzionalità simili ad esso in Python?Esiste un Python equivalente a HighLine?

per mostrare ciò che HighLine fa vedere il seguente esempio:

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 

Si chiede: "Sì o no?" E permette l'input dell'utente qualcosa. Finché l'utente non inserisce y o n (senza distinzione tra maiuscole e minuscole) stampa "Rispondi sì o no per sì o no" e consente all'utente di digitare nuovamente una risposta. Inoltre, se l'utente preme Invio, il valore predefinito è y. Alla fine, quando viene eseguito, l'input viene memorizzato in input. Ecco un esempio di risultato in cui l'utente prima immette "EH ???" e poi "y":

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

C'è un modo altrettanto semplice di fare lo stesso in Python?

+0

Non sembra così difficile da implementare. È solo una regex. Vedi il modulo ['re'] (http://docs.python.org/2/library/re.html). – Bakuriu

+0

Il tuo esatto esempio in Python è disponibile su [ghippo di Sergii Boiko] (https://github.com/cris/ruby-quiz-in-python/blob/master/src/highline.py) –

+0

@BurhanKhalid Se risponde al domanda che potresti voler elaborare in risposta. –

risposta

3

È possibile utilizzare il modulo Python 3 cliask. Il modulo è ispirato a the answer of IT Ninja, corregge some deficiencies in it e consente la convalida tramite un'espressione regolare, un predicato, una tupla o un elenco.

Il modo più semplice per ottenere il modulo è quello di installarlo tramite pip (vedi la readme per altri modi per installare):

sudo pip install cliask 

È quindi possibile utilizzare il modulo importando come nel seguente esempio:

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) 

Ed ecco come una sessione potrebbe apparire quando si esegue l'esempio:

 
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

Bello! Consiglio vivamente questo sopra il mio, stavo più o meno solo fornendo un esempio di base su come potresti implorarlo. –

3

Il seguente dovrebbe funzionare in modo simile per voi, anche se non sarà esattamente lo stesso stile di chiedere come lo è in Ruby.

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 

E lo si dovrebbe utilizzare come:

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

Sembra che tu abbia dimenticato "import re". È necessario continuare? Perché hai 'print self.invalid_response' prima di' se self.default == "break": \ break'? Qualche ragione particolare per cui non hai usato Python 3? –

+0

Perché usi 're.match' e non' re.search' (il primo [corrisponde solo al primo carattere di una stringa] (http://docs.python.org/3/library/re.html#search -Vs-match))? Inoltre sembra che i parametri siano stati posizionati in 're.match' nell'ordine sbagliato. Inoltre, non penso sia giustificato fare una lezione quando un modulo lo farà. Soprattutto quando un modulo renderà la semantica più semplice. Inoltre, il meccanismo predefinito non funziona per la tua implementazione. Inoltre, correct_response non è necessaria. Per risolvere tutto ciò ho postato [una risposta] (http://stackoverflow.com/a/14977144/789593). –