如何用rich.Prompt实现浮点数对或指定字母的用户输入?
用rich.Prompt混合处理命令输入与浮点数对
你可以通过自定义校验函数结合rich.Prompt的validate参数来实现这种混合输入的需求。核心思路是让校验函数同时处理两种输入场景:匹配指定命令(如Q),或者解析出合法的浮点数对,不符合要求时抛出明确的错误提示。
完整代码示例
from rich.prompt import Prompt, ValidationError def validate_input(input_str: str) -> str: # 先处理命令类输入(比如Q退出) command = input_str.strip().upper() if command in ["Q"]: return command # 处理浮点数对输入 parts = input_str.strip().split() if len(parts) != 2: raise ValidationError("请输入两个用空格分隔的浮点数,或输入Q退出") try: # 尝试转换为浮点数,确认合法性 float(parts[0]) float(parts[1]) return input_str except ValueError: raise ValidationError("输入的不是合法浮点数,请重新输入,或输入Q退出") # 获取用户输入 user_input = Prompt.prompt( "请输入一对浮点数(空格分隔),或输入Q退出", validate=validate_input, show_choices=False # 如果需要显示命令选项,可设为True并添加choices=["Q"]参数 ) # 处理返回结果 if user_input.upper() == "Q": print("退出程序") else: num1, num2 = map(float, user_input.split()) print(f"你输入的浮点数对是:{num1}, {num2}")
关键细节说明
- 自定义校验逻辑:
validate_input优先检查输入是否为指定命令,符合则直接返回;否则验证输入是否为两个空格分隔的合法浮点数,不满足时抛出ValidationError,rich会自动将错误信息展示给用户,直到输入合法。 - 命令扩展:如果需要新增命令(比如R重置),只需在命令判断的列表中添加对应字母即可,维护成本低。
- 交互优化:可以通过
choices=["Q"]和show_choices=True让Prompt显示可选命令,给用户更清晰的输入指引。 - 类型分离:校验阶段只负责验证格式合法性,类型转换放在结果处理阶段,保持校验逻辑单一清晰。
这种方式既利用了rich.Prompt的美观交互,又能让输入校验逻辑更简洁易维护,比原生input的循环校验方案更优雅。
内容的提问来源于stack exchange,提问作者toto
相关产品推荐
相关产品推荐

