model_validator的mode=“before“

"""

演示 mode="before" 中 data 参数的内容和返回值要求

"""

import typing as _t

from pydantic import BaseModel, model_validator

class DescribeWorkflowRequest(BaseModel):

session_id: str

dsl_data: _t.Optional[str] = None

dsl_path: _t.Optional[str] = None

复制代码
@model_validator(mode="before")
@classmethod
def validate_dsl_source(cls, data):
    """演示 data 的内容和必须返回字典"""
    print("\n" + "="*50)
    print("【mode='before' 验证器执行】")
    print("="*50)
    print(f"data 的类型: {type(data)}")
    print(f"data 的内容: {data}")
    print(f"data 是否为字典: {isinstance(data, dict)}")
    
    # 如果 data 是字典,可以访问和修改
    if isinstance(data, dict):
        print("\n可以访问字典的键:")
        for key in data.keys():
            print(f"  - {key}: {data[key]}")
        
        # 可以修改字典
        if "dsl_data" in data and data["dsl_data"]:
            data["dsl_data"] = data["dsl_data"].strip()  # 去除空白
        
        # 可以添加新字段
        data["_processed"] = True
    
    print("\n返回修改后的字典...")
    print("="*50 + "\n")
    
    # ⚠️ 必须返回字典!
    if isinstance(data, dict):
        return data
    else:
        # 如果不是字典,需要转换为字典
        return dict(data) if hasattr(data, '__dict__') else {}

============================================================================

测试不同的输入场景

============================================================================

print("测试1: 从字典创建")

print("-" * 50)

request1 = DescribeWorkflowRequest(

session_id="abc123",

dsl_data=" some data ",

dsl_path=None

)

print(f"最终结果: {request1.model_dump()}")

print("\n测试2: 从字典创建(缺少字段)")

print("-" * 50)

try:

request2 = DescribeWorkflowRequest(

session_id="abc123"

缺少 dsl_data 和 dsl_path

)

print(f"最终结果: {request2.model_dump()}")

except Exception as e:

print(f"错误: {e}")

print("\n测试3: 从 JSON 字符串创建(模拟 API 请求)")

print("-" * 50)

import json

json_data = json.loads('{"session_id": "xyz789", "dsl_path": "/path/to/file.json"}')

request3 = DescribeWorkflowRequest(**json_data)

print(f"最终结果: {request3.model_dump()}")

相关推荐
AI_Claude_code5 分钟前
ZLibrary访问困境方案三:Web代理与轻量级转发服务的搭建与优化
爬虫·python·web安全·搜索引擎·网络安全·web3·httpx
小陈工7 分钟前
2026年4月7日技术资讯洞察:下一代数据库融合、AI基础设施竞赛与异步编程实战
开发语言·前端·数据库·人工智能·python
时空无限13 分钟前
ansible 由于不同主机 python 版本不同执行报错
python·ansible
ZhengEnCi17 分钟前
P2E-Python字典操作完全指南-从增删改查到遍历嵌套的Python编程利器
python
alanesnape18 分钟前
使用AVL平衡树和列表实现 map容器 -- 附加测试/python代码
python·map·avl 平衡树·bst树·二叉树旋转
卤炖阑尾炎38 分钟前
Python 网络编程实战:从 TCP/UDP 基础到高并发服务器开发
网络·python·tcp/ip
weixin_513449961 小时前
walk_these_ways项目学习记录第八篇(通过行为多样性 (MoB) 实现地形泛化)--策略网络
开发语言·人工智能·python·学习
飞Link1 小时前
逆向兼容的桥梁:3to2 自动化降级工具实现全解析
运维·开发语言·python·自动化
曾阿伦1 小时前
Python3 文件 (夹) 操作备忘录
开发语言·python
架构师老Y2 小时前
006、异步编程与并发模型:asyncio与高性能后端
python