如何在打印及调用pydantic数据模型时隐藏password等敏感变量
实现方案
你可以通过重写Pydantic模型的__str__和__repr__方法实现需求,无需手动拼接所有字段,保留Pydantic默认输出格式的同时仅替换敏感字段值,兼容打印和直接调用实例两种场景。
完整代码示例(Pydantic V2 版本,当前主流版本)
from pydantic import BaseModel class myUserClass(BaseModel): # 注意Pydantic模型字段需要声明类型 User: str = 'foo' Password: str = 'bar' # 定义敏感字段集合,后续新增敏感字段直接加在这里即可 _SENSITIVE_FIELDS = {'Password'} def _get_masked_repr(self) -> str: # 导出模型所有字段为字典 model_dict = self.model_dump() # 替换敏感字段值为*** for field in self._SENSITIVE_FIELDS: if field in model_dict: model_dict[field] = '***' # 拼接为Pydantic默认的打印格式 params = ', '.join([f"{k}={repr(v)}" for k, v in model_dict.items()]) return f"{self.__class__.__name__}({params})" def __str__(self) -> str: return self._get_masked_repr() def __repr__(self) -> str: return self._get_masked_repr() U = myUserClass() print(U) # 输出:myUserClass(User='foo', Password='***') # 交互环境直接调用实例也会脱敏 U # 输出:myUserClass(User='foo', Password='***')
Pydantic V1 版本适配
如果你用的是Pydantic V1,只需把代码里的self.model_dump()替换为self.dict()即可,其余逻辑完全一致。
逻辑说明
- 打印实例时会调用类的
__str__方法,直接输出实例时会调用__repr__方法,同时重写两个方法即可覆盖两种场景 - 复用Pydantic自带的字段导出能力,不需要手动维护字段列表,新增字段时会自动纳入输出,仅过滤配置的敏感字段,完全保留原有输出格式
内容的提问来源于stack exchange,提问作者Phann
相关产品推荐
相关产品推荐

