2013-02-19 14 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

+0

Pythonでのあなたの正確な例は、[Sergii Boikoのgithub](https://github.com/cris/ruby-quiz-in-python/blob/master/src/highline.py) –

+0

@BurhanKhalidにあります。あなたは答えにそれを詳しく説明したいかもしれない質問。 –

答えて

3

あなたは、Python 3モジュールcliaskを使用することができます。このモジュールはthe answer of IT Ninjaに触発され、some deficiencies in itを修正し、正規表現、述語、タプル、またはリストを介した検証を可能にします。

sudo pip install cliask 

あなたは、次の例のようにインポートすることで、モジュールを使用することができます:

モジュールを取得する最も簡単な方法は、(インストールの他の方法についてreadmeを参照)pipを経由して、それをインストールすることです

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

ニース!私は非常に私の上にこの1つを示唆、私は多かれ少なかれあなたがこれをimplimentする方法の基本的な例を提供していた。 –

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'を忘れたようです。 「続ける」必要はありますか? 'self.default ==" break ":\ break'の前に' print self.invalid_response'をなぜ持っていますか? Python 3を使用しなかった特別な理由はありますか? –

+0

なぜ 're.search'ではなく' re.match'を使用していますか?(以前の[文字列の最初の文字にのみ一致します](http://docs.python.org/3/library/re.html#search -vs-match))?また、 're.match'にパラメータを間違った順序で入れたようです。また、モジュールを作るときにクラスを作ることが正当だとは思わない。特にモジュールがそれの意味をより簡単にする場合。また、実装にはデフォルトのメカニズムが機能しません。また、correct_responseは必要ありません。このすべてを修正するために、私は[回答](http://stackoverflow.com/a/14977144/789593)を投稿しました。 –

関連する問題