2013-02-19 81 views
7

HighLine是一個用於緩解控制檯輸入和輸出的Ruby庫。它提供的方法可以讓您請求輸入並驗證它。有沒有提供類似於Python的功能的東西?是否有與HighLine相當的Python?

顯示什麼海萊不看下面的例子:

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 

它問:「是還是不是?」並讓用戶輸入的東西。只要用戶不輸入y或n(不區分大小寫),它就會輸出「回答y或n是或不是」,並讓用戶再次輸入答案。此外,如果用戶按Enter鍵,則默認爲y。最後,當它完成時,輸入存儲在input中。這裏是用戶首先輸入「EH ???」的示例結果然後是「y」:

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

Python是否有類似的簡單方法?

+0

實現起來並不困難。這只是一個正則表達式。請參閱['re'](http://docs.python.org/2/library/re.html)模塊。 – Bakuriu 2013-02-19 17:29:05

+0

你在Python中的確切例子可以在[Sergii Boiko的github](https://github.com/cris/ruby-quiz-in-python/blob/master/src/highline.py) – 2013-02-19 18:20:42

+0

@BurhanKhalid如果它回答了您可能想要將其解釋爲問題的答案。 – 2013-02-19 20:01:07

回答

3

您可以使用Python 3模塊cliask。該模塊的啓發是the answer of IT Ninja,修復了some deficiencies in it並允許通過正則表達式,謂詞,元組或列表進行驗證。

進入模塊最簡單的方法是通過pip安裝它(見readme安裝的其他方式):

sudo pip install cliask 

然後,您可以通過導入像在下面的例子中使用的模塊:

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) 

這裏是一個會話會是什麼樣運行例如當:

 
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

不錯!我強烈建議這個對我來說,我或多或少只是提供一個基本的例子,說明你可能會如何實現這一點。 – 2013-02-20 14:11:45

3

以下應爲工作類似,雖然它不會像在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 

而且你會用它想:

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

中描述了類似的方法您似乎忘記了'import re'。是否需要繼續?爲什麼在'if self.default ==「break」:\ break'之前得到'print self.invalid_response'?你沒有使用Python 3的任何特定原因? – 2013-02-20 06:35:51

+0

爲什麼使用're.match'而不是're.search'(前者[只匹配字符串的第一個字符](http://docs.python.org/3/library/re.html#search -vs匹配))?你似乎也把參數放在're.match'中的順序是錯誤的。另外,我不認爲在一個模塊能夠做到的時候制定課程是不必要的。特別是當一個模塊將使它的語義更簡單。此外,默認機制不適用於您的實施。另外,不需要correct_response。爲了解決所有這些問題,我發佈了[答案](http://stackoverflow.com/a/14977144/789593)。 – 2013-02-20 10:09:05

相關問題