Python有类似于HighLine的工具吗?

7

HighLine是一个Ruby库,用于简化控制台的输入和输出。它提供了让您请求输入并验证输入的方法。有类似的Python功能吗?

为了展示HighLine的功能,请看以下示例:

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

它会询问“Yes”或“No”,并允许用户输入内容。只要用户不输入y或n(不区分大小写),它就会打印“Answer y or n for yes or no”,并让用户再次输入答案。此外,如果用户按Enter,则默认为y。最后,输入存储在input中。下面是一个示例结果,其中用户首先输入“EH???”然后输入“y”:

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

在Python中是否有类似简单的方法?


实现起来似乎并不难。只需要一个正则表达式即可。请参考re模块。 - Bakuriu
你可以在Sergii Boiko的github上找到Python的完整示例。 - Burhan Khalid
如果它回答了问题,您可能希望将其详细说明为答案。 - N.N.
一个类似的方法在https://dev59.com/GHE85IYBdhLWcg3wViA4#2827094中有描述。 - N.N.
2个回答

3
你可以使用Python 3模块cliask。该模块受IT Ninja答案启发,修复了其中的一些缺陷,并允许通过正则表达式、谓词、元组或列表进行验证。
获取该模块最简单的方法是通过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)

下面是运行示例时会话的样子:

是或否?|y| EH???
请输入“yes”或“no”
是或否?|y| y
牛还是猫?兔子
你必须说出牛或猫
牛还是猫?猫
真
猫

不错!我强烈建议你使用这个,相比之下我的只是提供了一个基本的实现示例。 - IT Ninja

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()

你似乎忘了 import recontinue 是必要的吗?为什么在 if self.default=="break": \ break 之前有 print self.invalid_response?你为什么没有使用 Python 3? - N.N.
为什么要使用re.match而不是re.search(前者只匹配字符串的第一个字符)?此外,您似乎将re.match中的参数放错了顺序。另外,我认为没有必要创建一个类,当一个模块就可以做到时。特别是当一个模块会使语义更简单时。此外,默认机制对于您的实现无效。同时,correct_response也是不必要的。为了解决所有这些问题,我已经发布了答案 - N.N.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接