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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:50:31