如何在Pydantic BaseModel中用typing.Union保留bytes和str原类型?
问题:Pydantic模型如何保留str/bytes的原始类型?
需求:让模型仅接受bytes类型或str类型变量,传入其他类型时抛出异常。
当前代码:
from typing import Union from pydantic import BaseModel class MyModel(BaseModel): a: Union[bytes, str] m1 = MyModel(a='123') m2 = MyModel(a=b'123') print(type(m1.a)) print(type(m2.a))
当前输出:
<class 'bytes'> <class 'bytes'>
问题:模型会自动将字符串和bytes都解析为bytes类型,不符合预期。
期望输出:
<class 'str'> <class 'bytes'>
目前临时解决方法:重新赋值成员变量可实现预期效果,但需要两步操作:
m1 = MyModel(a='123') m1.a = '123'
询问:能否一步实现该预期效果?
解决方案
可以通过Pydantic提供的严格类型实现,用StrictStr和StrictBytes替代普通的str和bytes,模型会严格保留传入值的原始类型,同时在传入非指定类型时抛出验证异常。
修改后的代码:
from typing import Union from pydantic import BaseModel, StrictStr, StrictBytes class MyModel(BaseModel): a: Union[StrictStr, StrictBytes] m1 = MyModel(a='123') m2 = MyModel(a=b'123') print(type(m1.a)) print(type(m2.a))
运行输出:
<class 'str'> <class 'bytes'>
原理说明
Pydantic默认的str和bytes类型会触发隐式转换:传入字符串时会自动转为bytes类型,这就是你看到两个实例的a都是bytes的原因。而StrictStr和StrictBytes会关闭自动转换逻辑,既严格校验输入类型,又保留原始值的类型。
如果传入其他类型(比如整数123),模型会直接抛出ValidationError,满足“传入其他类型时抛出异常”的需求。
内容的提问来源于stack exchange,提问作者Mirrah
相关产品推荐
相关产品推荐

