You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:03:23