如何实现支持传入数据类型参数的Python通用输入验证函数?
通用输入验证函数的优化实现
问题背景
我正在做一个需要大量输入验证的项目,目前定义了如下针对float类型的验证函数:
def get_valid_float(inputMessage,errorMessage): while True: variableInput = input(inputMessage) try: variableInput = float(variableInput) return variableInput except ValueError: print(errorMessage)
该函数支持自定义用户提示消息,验证输入是否为float类型,若验证失败则输出自定义错误消息,循环直至用户输入有效内容。
但我不想为每种数据类型都单独编写验证函数,希望合并为一个get_valid_input()函数,通过传入第三个参数指定要验证的数据类型,例如get_valid_input(complex,inputMessage,errorMessage)。
我最初想通过判断字符串类型来实现,但这种方式需要为每种数据类型编写elif分支,过于繁琐:
def get_valid_float(dataType,inputMessage,errorMessage): if dataType == "float": while True: variableInput = input(inputMessage) try: variableInput = float(variableInput) return variableInput except ValueError: print(errorMessage) elif dataType == "integer": while True: variableInput = input(inputMessage) try: variableInput = int(variableInput) return variableInput except ValueError: print(errorMessage)
我想知道是否有更简便的方法,比如直接执行variableInput = dataType(variableInput)来验证输入是否符合指定数据类型?
解决方案
当然可以直接传入数据类型的构造函数作为参数,完全不需要写一堆分支判断。Python中像int、float、complex这些都是可调用的构造函数,直接把它们作为参数传入函数,在try块里调用即可。
优化后的通用函数如下:
def get_valid_input(data_type, input_message, error_message): while True: user_input = input(input_message) try: return data_type(user_input) except ValueError: print(error_message)
使用示例
- 获取整数输入:
age = get_valid_input(int, "请输入你的年龄:", "输入无效,请输入整数!")
- 获取浮点数输入:
weight = get_valid_input(float, "请输入你的体重(kg):", "输入无效,请输入数字!")
- 获取复数输入:
complex_num = get_valid_input(complex, "请输入一个复数(如1+2j):", "输入无效,请输入正确格式的复数!")
扩展说明
如果需要更复杂的验证逻辑(比如输入范围限制),还可以额外传入一个验证函数作为参数,进一步扩展通用性:
def get_valid_input(data_type, input_message, error_message, validator=None): while True: user_input = input(input_message) try: value = data_type(user_input) if validator is not None and not validator(value): print(error_message) continue return value except ValueError: print(error_message)
比如验证年龄在0-120之间:
age = get_valid_input(int, "请输入你的年龄:", "输入无效,请输入0-120之间的整数!", lambda x: 0 <= x <= 120)
内容的提问来源于stack exchange,提问作者Polyicio
相关产品推荐
相关产品推荐

