Python-pydantic校验


1-知识整理

1-UV 环境管理

# 1-查看并指定环境
uv python list
uv python pin 3.10

# 2-进行项目创建
uv init hello-pydantic && cd hello-pydantic

# 3-指定本地运行环境
uv venv && source .venv/bin/activate

# 4-本地环境安装依赖
uv pip install pydantic

2-pydantic功能

1-将dict转化为对象[校验必填+自动类型转化]

  • 校验必填->必填字段没有赋值就报错
  • 自动类型转化->string可以自定转化为int【前提是可以转】
# 使用pydantic定义Dict数据类型
class User(BaseModel):
    id: int
    name: str
    email: str
    age: Optional[int] = None

# 字符串 '123' 会被自动转换为整数 123
user_data_auto = {
    'id': '123',
    'name': 'Bob',
    'email': 'bob@example.com'
}

# 将dict转化为对象[校验必填+自动类型转化]
user_auto = User(**user_data_auto)
print(f"validate_user_auto->", user_auto)

2- JSON 序列化

类比Java中的JsonUtil类,将【对象】【Map】【JsonString】进行互相转化

1-【对象->jsonString】->user_json_string = user.json()

2-【jsonString->对象】->user_from_json = User.parse_raw(user_json_string)

# 1-先准备对象数据(dict->对象)
user = User(**user_dict_data)

# 2-对象实例转JSON(对象->jsonString)
user_json_string = user.json()
print(user_json_string)
# 输出: {"id": 1, "name": "Alice", "email": "alice@example.com", "age": 25}

# 3-JSON 转模型实例(jsonString->对象)
user_from_json = User.parse_raw(user_json_string)
print(user_from_json)
# 输出: id=1 name='Alice' email='alice@example.com' age=25

3-字段复杂逻辑判断

from typing import Optional

from pydantic import BaseModel, ValidationError, field_validator


class UserWithValidator(BaseModel):
    id: int
    name: str
    email: str
    age: Optional[int] = None

    # 针对业务进行复杂逻辑校验
    @field_validator('age')
    @classmethod
    def validate_age(cls, v: int) -> int:
        if v < 18:
            raise ValueError('Age must be at least 18')
        return v


# 测试验证器
try:
    user_invalid_age = UserWithValidator(id=1, age=10, name='Dave', email='invalid-email')
except ValidationError as e:
    print(e)
    # 输出:
    # 1 validation error for UserWithValidator
    # age
    #   Value error, Age must be at least 18 [type=value_error, input_value=10, input_type=int]


4-Secret敏感字符

from pydantic import Secret

# 1-定义dict信息
user_data_log = {
    'id': '123',
    'name': 'Bob',
    'email': Secret('bob@example.com')
}

# 打印dict信息:{'id': '123', 'name': 'Bob', 'email': Secret('**********')}
print(f"validate_user_auto->", user_data_log)


2-pydantic校验详解

Pydantic 是一个在 Python 中用于数据验证和解析的库,它通过 Python 的类型注解(type hints)来定义数据模型,并自动进行数据验证、类型转换和序列化。Pydantic 的核心是 BaseModel 类,它允许你以类属性的方式定义字段,并自动处理数据验证。

Pydantic 的主要特点包括:

  • 类型安全:利用 Python 的类型注解,确保数据类型正确。
  • 自动验证:自动验证输入数据是否符合模型定义。
  • 错误处理:提供详细的错误信息,方便调试。
  • 性能高效:使用 Cython 优化,性能优越。
  • JSON 支持:轻松实现 JSON 序列化和反序列化。

安装 Pydantic

你可以使用 pip 安装 Pydantic:

pip install pydantic

基本使用示例

以下是使用 Pydantic 的最常用方法代码示例:

1. 定义模型
from pydantic import BaseModel, ValidationError
from typing import Optional

class User(BaseModel):
    id: int
    name: str
    email: str
    age: Optional[int] = None
2. 创建模型实例
# 正确数据
user_data = {
    'id': 1,
    'name': 'Alice',
    'email': 'alice@example.com',
    'age': 25
}

user = User(**user_data)
print(user)
# 输出: id=1 name='Alice' email='alice@example.com' age=25
3. 自动类型转换
# 字符串 '123' 会被自动转换为整数 123
user_data_auto = {
    'id': '123',
    'name': 'Bob',
    'email': 'bob@example.com'
}

user_auto = User(**user_data_auto)
print(user_auto)
# 输出: id=123 name='Bob' email='bob@example.com' age=None
4. 数据验证
# 错误数据,缺少必填字段
invalid_data = {
    'id': 1,
    'name': 'Charlie'
}

try:
    user_invalid = User(**invalid_data)
except ValidationError as e:
    print(e)
    # 输出:
    # 1 validation error for User
    # email
    #   field required (type=value_error.missing)
5. JSON 序列化
# 模型实例转 JSON
user_json = user.json()
print(user_json)
# 输出: {"id": 1, "name": "Alice", "email": "alice@example.com", "age": 25}

# JSON 转模型实例
user_from_json = User.parse_raw(user_json)
print(user_from_json)
# 输出: id=1 name='Alice' email='alice@example.com' age=25
6. 字段验证器(可选)
from typing import Optional

from pydantic import BaseModel, ValidationError, field_validator


class UserWithValidator(BaseModel):
    id: int
    name: str
    email: str
    age: Optional[int] = None

    @field_validator('age')
    @classmethod
    def validate_age(cls, v: int) -> int:
        if v < 18:
            raise ValueError('Age must be at least 18')
        return v


# 测试验证器
try:
    user_invalid_age = UserWithValidator(id=1, age=10, name='Dave', email='invalid-email')
except ValidationError as e:
    print(e)
    # 输出:
    # 1 validation error for UserWithValidator
    # age
    #   Value error, Age must be at least 18 [type=value_error, input_value=10, input_type=int]

总结

Pydantic 是一个功能强大且易于使用的库,适用于任何需要数据验证和解析的场景,如 Web 开发(FastAPI 就是基于 Pydantic)、配置文件解析、API 数据交互等。通过类型注解和自动验证,Pydantic 大大简化了数据处理的复杂性,提高了代码的健壮性和可维护性。


3-pydantic单词解释

Pydantic 的命名其实是个双关语(pun),结合了 PythonPedantic 两个词:


1-拆解命名来源:

部分 含义
Py- 来自 Python,表明这是为 Python 设计的库。
-dantic 来自 Pedantic,意为“迂腐的”、“过分注重细节的”。

2-为什么用“Pedantic”?

Pydantic 的核心目标是对数据类型和结构进行严格、细致的验证,就像个“迂腐的学究”一样,容不得半点类型错误或字段缺失。
所以作者 Samuel Colvin 用“Pedantic”来形容这种严格、吹毛求疵的验证风格,非常贴切。


3-总结一句话:

Pydantic = Python + Pedantic,意思是“用 Python 写的、对数据验证极其严格的库”。


4-小彩蛋:

这种命名方式在 Python 社区挺常见,比如:

  • PyLint(Python + Lint)
  • PyTest(Python + Test)
  • PyArrow(Python + Arrow,Arrow 是列式内存格式)

Pydantic 的命名不仅有趣,还精准传达了它的设计理念:严格、清晰、可靠


Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐