如何在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
相关产品推荐
相关产品推荐

