2013-02-19 30 views
7

HighLine to biblioteka Ruby do łagodzenia wejścia i wyjścia konsoli. Udostępnia metody, które umożliwiają żądanie wprowadzenia i sprawdzenie poprawności. Czy jest coś, co zapewnia funkcjonalność podobną do tej w Pythonie?Czy istnieje odpowiednik Python dla HighLine?

Aby pokazać co HighLine widzi następujący przykład:

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 

on pyta: „Tak czy nie?” I pozwala na coś wprowadzania danych przez użytkownika. Dopóki użytkownik nie wprowadzi y lub n (bez rozróżniania wielkości liter), wypisuje "Odpowiedź y lub n dla tak lub nie" i pozwala użytkownikowi ponownie wpisać odpowiedź. Także jeśli użytkownik naciśnie Enter, to domyślnie jest ustawiony na y. W końcu, gdy jest to zrobione, dane wejściowe są przechowywane w input. Oto przykładowy wynik, w którym użytkownik najpierw wprowadza "EH ???" a następnie "y":

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

Czy istnieje podobny prosty sposób, aby zrobić to samo w Pythonie?

+0

Nie wydaje się tak trudne do wdrożenia. To tylko wyrażenie regularne. Zobacz moduł ['re'] (http://docs.python.org/2/library/re.html). – Bakuriu

+0

Twój dokładny przykład w Pythonie jest dostępny na [github Sergii Boiko] (https://github.com/cris/ruby-quiz-in-python/blob/master/src/highline.py) –

+0

@BurhanKhalid Jeśli odpowiada pytanie, które możesz chcieć rozwinąć w odpowiedzi. –

Odpowiedz

3

można użyć modułu cliask Python 3. Moduł jest inspirowany przez the answer of IT Ninja, naprawia some deficiencies in it i umożliwia sprawdzanie poprawności za pomocą wyrażenia regularnego, predykatu, krotki lub listy.

Najłatwiej dostać moduł jest zainstalowanie go poprzez pip (patrz readme dla innych sposobów instalacji):

sudo pip install cliask 

Następnie można użyć modułu importując jak w poniższym przykładzie:

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) 

A oto jak może wyglądać sesja podczas uruchamiania przykład:

 
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

Nice! Wysoko sugeruję, że ten jeden nad moim, ja byłem mniej więcej po prostu podstawowym przykładem tego, w jaki sposób możesz to implicytować. –

3

Następujący powinien działa podobnie dla ciebie, chociaż nie będzie to dokładnie taki sam styl zapytania, jak w 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 

I byłoby użyć go lubię:

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

Wygląda na to, że zapomniałeś 'import re'. Czy konieczne jest "kontynuowanie"? Dlaczego masz 'print self.invalid_response' przed' if self.default == "break": \ break'? Jakieś szczególne powody, dla których nie korzystałeś z Pythona 3? –

+0

Dlaczego używasz 're.match', a nie' re.search' (ten pierwszy [pasuje tylko do pierwszej litery ciągu znaków] (http://docs.python.org/3/library/re.html#search -vs-match))? Wygląda na to, że parametry zostały umieszczone w 're.match' w niewłaściwej kolejności. Ponadto, nie wydaje mi się, że jest to uzasadnione, aby utworzyć klasę, gdy moduł zrobi. Zwłaszcza gdy moduł uprości tę semantykę. Ponadto domyślny mechanizm nie działa w przypadku Twojej implementacji. Ponadto poprawna odpowiedź nie jest potrzebna. Aby naprawić to wszystko, wysłałem [odpowiedź] (http://stackoverflow.com/a/14977144/789593). –

Powiązane problemy