2013-02-19 48 views
7

HighLine là thư viện Ruby để giảm bớt đầu vào và đầu ra của bàn điều khiển. Nó cung cấp các phương thức cho phép bạn yêu cầu đầu vào và xác nhận nó. Có cái gì đó cung cấp chức năng tương tự như nó trong Python?Có Python tương đương với HighLine không?

Để hiển thị những gì Highline không xem ví dụ sau:

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 

Nó hỏi "Có hay không?" Và cho phép người dùng nhập vào một cái gì đó. Miễn là người dùng không nhập y hoặc n (không phân biệt chữ hoa chữ thường), nó in "Trả lời y hoặc n nếu có hoặc không" và cho phép người dùng nhập lại câu trả lời. Ngoài ra, nếu người dùng nhấn Enter, giá trị mặc định là y. Cuối cùng, khi nó được thực hiện đầu vào được lưu trữ trong input. Đây là kết quả ví dụ khi người dùng nhập "EH ???" đầu tiên và sau đó "y":

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

Có cách tương tự đơn giản để thực hiện tương tự trong Python không?

+0

Nó trông không khó thực hiện. Nó chỉ là một regex. Xem mô-đun ['re'] (http://docs.python.org/2/library/re.html). – Bakuriu

+0

Ví dụ chính xác của bạn trong Python có sẵn trên [Sergii Boiko's github] (https://github.com/cris/ruby-quiz-in-python/blob/master/src/highline.py) –

+0

@BurhanKhalid Nếu nó trả lời câu hỏi bạn có thể muốn xây dựng nó thành câu trả lời. –

Trả lời

3

Bạn có thể sử dụng Python 3 mô-đun cliask. Mô-đun được lấy cảm hứng từ the answer of IT Ninja, sửa lỗi some deficiencies in it và cho phép xác thực qua regex, vị từ, bộ hoặc danh sách.

Cách dễ nhất để có được những mô-đun là cài đặt nó thông qua pip (xem readme cho cách khác để cài đặt):

sudo pip install cliask 

Sau đó bạn có thể sử dụng các mô-đun bằng cách nhập như trong ví dụ sau:

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) 

Và đây là làm thế nào một phiên có thể trông khi chạy ví dụ:

 
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

Rất tuyệt! Tôi đánh giá cao đề nghị này hơn tôi, tôi đã nhiều hơn hoặc ít hơn chỉ cung cấp một ví dụ cơ bản về cách bạn có thể impliment này. –

3

Sau đây nên hoạt động tương tự cho bạn, mặc dù nó sẽ không chính xác cùng kiểu hỏi như trong 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 

Và bạn sẽ sử dụng nó như:

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

Dường như bạn đã quên 'nhập lại'. 'Tiếp tục' có cần thiết không? Tại sao bạn có 'print self.invalid_response' trước' if self.default == "break": \ break'? Bất kỳ lý do cụ thể nào bạn không sử dụng Python 3? –

+0

Tại sao bạn sử dụng 're.match' và không' re.search' (trước đây [chỉ khớp với ký tự đầu tiên của chuỗi] (http://docs.python.org/3/library/re.html#search -vs-match))? Ngoài ra bạn dường như đã đặt các tham số trong 're.match' theo thứ tự sai. Ngoài ra, tôi không nghĩ rằng nó được đảm bảo để làm cho một lớp học khi một mô-đun sẽ làm. Đặc biệt khi một mô-đun sẽ làm cho ngữ nghĩa của nó đơn giản hơn. Ngoài ra, cơ chế mặc định không hoạt động cho việc triển khai của bạn. Ngoài ra, correct_response là không cần thiết. Để khắc phục tất cả những điều này tôi đã đăng [câu trả lời] (http://stackoverflow.com/a/14977144/789593). –

Các vấn đề liên quan