Python将函数作为字典值实现输入条件校验的问题求解
问题修复与多参数传递方案
你现有代码存在两个可直接修复的问题,多参数传递不需要调整原有遍历循环的逻辑:
- Python 语法不支持在字典字面量内直接使用
def定义函数,且pass if 条件 else raise属于非法写法 - 需要额外入参的校验函数,可通过闭包工厂、
functools.partial提前绑定额外参数,最终保证所有存入字典的校验函数都只接收用户输入的文本这一个参数,和原有调用逻辑完全兼容。
可直接运行的修正代码
from functools import partial # 提前定义校验需要的外部参数 valid_name_list = ["Zhang", "Li", "Wang"] # 复杂校验逻辑可单独在外层定义,需要额外参数就用闭包生成对应校验函数 def check_in_name_list(input_text, allowed_names): if input_text not in allowed_names: raise ValueError def check_min_number(input_text, min_val): if int(input_text) <= min_val: raise ValueError # 构造输入配置字典,不要用dict作为变量名,会覆盖内置类型 input_config = { 'input 1': [ '请输入大于10的数字:', partial(check_min_number, min_val=10), '输入错误:数字必须大于10' ], 'input 2': [ '请输入长度为3的文本:', lambda t: len(t) == 3 or (_ for _ in ()).throw(ValueError), '输入错误:文本长度必须为3' ], 'input 3': [ '请输入姓名:', partial(check_in_name_list, allowed_names=valid_name_list), f'输入错误:姓名必须为列表内有效值:{valid_name_list}' ] } # 原有遍历输入的逻辑完全不需要修改 for prompt, check_func, err_tip in input_config.values(): while True: user_input = input(prompt) try: check_func(user_input) break except ValueError: print(err_tip)
扩展说明
- 简单校验逻辑可以直接用lambda实现,复杂逻辑单独在外层用
def定义即可。如果需要不同的参数组合,直接写闭包工厂函数生成校验器就行,比如要做长度区间校验:
# 闭包工厂:传入长度范围,返回对应校验函数 def make_length_check(min_len, max_len): def length_checker(input_text): if not (min_len <= len(input_text) <= max_len): raise ValueError return length_checker # 新增配置项直接调用工厂生成校验函数即可,不需要改循环逻辑 'input_4': [ '请输入2-6位密码:', make_length_check(2,6), '输入错误:密码长度必须在2-6位之间' ]
- 所有存入配置字典的校验函数,最终都要保证调用时只传用户输入这一个参数,不管是用
partial绑定参数,还是用闭包生成函数,本质都是提前把额外参数塞到函数的运行上下文里,和你现有逻辑完全适配。
内容的提问来源于stack exchange,提问作者Simple_coder
相关产品推荐
相关产品推荐

