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

如何在Pydantic模型/字段验证器中正确输出日志信息

如何在Pydantic模型/字段验证器中正确输出日志信息

你遇到的问题是明明调试时确认代码走到了log.warning和print的逻辑,但终端就是看不到输出。这其实是两个常见的小问题导致的,咱们一步步解决:

问题1:Logging模块未配置

Python的logging模块默认是没有配置输出处理器的——哪怕你调用了log.warning,日志信息也没有地方可去。只有当你明确配置了日志的输出方式(比如控制台、文件),才能看到日志内容。

解决办法:在代码开头添加日志配置,最简单的方式是用logging.basicConfig:

import logging

# 配置日志,设置级别为WARNING,输出到控制台
logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

log = logging.getLogger(__name__)

另外还要提醒你一个容易忽略的小细节:你的原代码里check_values方法没有返回data,这会导致Pydantic无法拿到验证后的数据源,模型实例化直接报错,一定要加上return data!

问题2:Print输出被缓冲

有时候print的内容会因为输出缓冲机制,没有立即显示到终端。尤其是在非交互式环境或者某些调试场景下,缓冲会累积到一定程度才会输出。

解决办法:给print加上flush=True参数,强制刷新输出缓存:

print("both values set to 2", flush=True)

完整可运行代码

把上面的修改整合起来,同时纠正原代码里的类型注解错误(Pydantic基础类型要用小写的int,而非Int),完整代码如下:

import logging
from pydantic import BaseModel, model_validator

# 配置日志
logging.basicConfig(level=logging.WARNING, format='%(levelname)s: %(message)s')
log = logging.getLogger(__name__)

class MyModel(BaseModel):
    a: int
    b: int
    
    @model_validator(mode="before")
    @classmethod
    def check_values(cls, data):
        if data.get("a") == 2 and data.get("b") == 2:
            log.warning("both values set to 2")
            print("both values set to 2", flush=True)
        return data  # 必须返回data,否则模型无法完成实例化

# 测试代码
my_model = MyModel(a=2, b=2)

运行这段代码,你就能在终端同时看到日志和print的输出了。

备注:内容来源于stack exchange,提问作者Ni3dzwi3dz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:54:34