如何编写校验指定结构字典值合法性的Python函数
IsValid 校验函数实现
你可以按优先级逐层校验每一个字段的规则,只要任意条件不满足就立即返回False,避免后续访问不存在的键触发异常,具体实现如下:
def IsValid(data): # 第一步:校验输入本身是字典,且包含3个必填顶级键 if not isinstance(data, dict): return False required_top_keys = {'name', 'pass', 'rule'} if not required_top_keys.issubset(data.keys()): return False # 第二步:校验name、pass字段的规则 name_val = data['name'] pass_val = data['pass'] if not (isinstance(name_val, str) and len(name_val) > 1): return False if not (isinstance(pass_val, str) and len(pass_val) > 1): return False # 第三步:校验rule字段的结构 rule_val = data['rule'] if not isinstance(rule_val, dict): return False required_rule_keys = {'vals', 'char'} if not required_rule_keys.issubset(rule_val.keys()): return False # 第四步:校验rule下vals的规则 vals_val = rule_val['vals'] if not isinstance(vals_val, tuple) or len(vals_val) != 2: return False if not (isinstance(vals_val[0], int) and vals_val[0] > 0 and isinstance(vals_val[1], int) and vals_val[1] > 0): return False # 第五步:校验rule下char的规则 char_val = rule_val['char'] if not (isinstance(char_val, str) and len(char_val) == 1 and char_val.islower()): return False # 所有规则都满足 return True
校验逻辑说明
- 访问顶级字典键时直接通过
data['键名']获取值,只有提前校验过键存在才会执行后续取值操作,不会触发KeyError - 每个字段的校验严格对应规则要求:
- 字符串类型用
isinstance(值, str)判断,长度用len()校验 - 元组类型用
isinstance(值, tuple)判断,长度限制为2后逐一校验元素为正整数 - 单个小写字母用
len(值) == 1和str.islower()方法联合校验
- 字符串类型用
测试效果
# 示例1 返回True print(IsValid({'name':'john.d', 'pass':'aabcde', 'rule':{'vals':(2,4), 'char':'a'}})) # 示例2 返回False print(IsValid({'name':'john.d', 'pass':'aabcde', 'rule':{'vals':1, 'char':'a'}}))
内容的提问来源于stack exchange,提问作者Cate C
相关产品推荐
相关产品推荐

