Python编写的密码校验函数无法正常运行,该如何排查修正错误?
错误梳理
1. passwordlength 函数错误
- 大写判断条件逻辑冗余错误:原判断
char in "大写串" and "数字串" and "小写串"等价于仅判断字符是否为大写,多余的and后内容无实际作用,属于书写失误。 - 缺失小写校验逻辑(根据你条件里书写的小写串推测,你本来需要密码同时包含小写字母),原函数未定义小写对应的标记变量和判断逻辑。
- 提前返回逻辑有隐患:遍历到满足三个标记的位置就直接返回,若后续要追加其他单字符校验会直接失效,建议遍历完全部字符后再统一返回结果。
2. passwordOK 函数错误
- 长度校验规则错误且逻辑顺序混乱:原要求是6到12位,你写的是
>6且<12,漏掉了长度等于6、12的合法场景;且长度校验通过后直接返回True,完全没有执行后续的字符重复次数校验。 - 字符重复校验逻辑完全写反:原要求是所有字符出现次数都小于3,你写的是只要有任意一个字符出现次数<=3就直接返回True,哪怕有其他字符出现次数超标也不会被检测到。
- 重复调用
passwordlength函数,多余消耗性能,可直接复用一次调用的结果。
修正后完整代码
def passwordlength(password: str): # 定义四个标记分别对应大写、小写、数字、特殊字符是否存在 upper = lower = digit = special = False for char in password: if char.isupper(): upper = True elif char.islower(): lower = True elif char.isdigit(): digit = True elif char in "$#@%!": special = True # 所有基础规则都满足才返回True return upper and lower and digit and special def passwordOK(password: str): # 1. 先校验基础规则 if not passwordlength(password): return False # 2. 校验长度在6-12之间(包含边界) if not (6 <= len(password) <= 12): return False # 3. 校验所有字符出现次数都小于3,用set去重减少重复计算 for char in set(password): if password.count(char) >= 3: return False # 全部校验通过返回True return True # 测试用例 print(passwordOK(password='aaaa1jd4kjfs$jDhfksfd'))
上述测试用例执行结果为
False,符合预期:该密码长度远超12位,且字符a出现次数大于2。
规则调整说明
如果你的基础校验规则不需要包含小写字母,删除passwordlength里的lower相关判断逻辑即可。
内容的提问来源于stack exchange,提问作者Joshua Bradley
相关产品推荐
相关产品推荐

