如何修复Pydantic密码验证中if not any条件失效问题?
修复Pydantic密码验证的条件判断问题
原代码中的if not any(...)条件存在逻辑错误:它要求单个字符同时满足大写、小写、数字、标点四种属性,这在现实中不可能实现,因此这个判断永远返回False,导致if not any始终为True,每次都会抛出密码不符合要求的错误。
正确的验证逻辑
需要分别检查密码是否包含每种类型的字符,而非要求单个字符同时满足所有条件:
修正后的代码(对应原错误提示的三个要求:大写、小写、数字)
import string from pydantic import field_validator @field_validator("password") def check_password(cls, value): value = str(value) if len(value) < 8: raise ValueError("Password must have at least 8 characters") # 分别检查每个字符类型是否存在 has_upper = any(c.isupper() for c in value) has_lower = any(c.islower() for c in value) has_digit = any(c.isdigit() for c in value) if not (has_upper and has_lower and has_digit): raise ValueError("Password must have at least one uppercase letter, one lowercase letter, and one digit") return value
如果需要额外验证标点符号(对应原代码中的标点检查)
只需添加标点的验证条件:
import string from pydantic import field_validator @field_validator("password") def check_password(cls, value): value = str(value) if len(value) < 8: raise ValueError("Password must have at least 8 characters") has_upper = any(c.isupper() for c in value) has_lower = any(c.islower() for c in value) has_digit = any(c.isdigit() for c in value) has_punct = any(c in string.punctuation for c in value) if not (has_upper and has_lower and has_digit and has_punct): raise ValueError("Password must have at least one uppercase letter, one lowercase letter, one digit, and one punctuation mark") return value
逻辑说明
- 用
any()分别检查每种字符类型是否存在,每个any()遍历密码字符,只要找到一个符合条件的字符就返回True - 最后通过逻辑与(
and)判断所有要求是否同时满足,若有任意一个不满足则抛出错误
内容的提问来源于stack exchange,提问作者ProxilityProblemSolver
相关产品推荐
相关产品推荐

