Python 3.10.0 定义 Pydantic 模型时报 ForwardRef 不接受 is_class
Pydantic 2.14.0 在 Python 3.10.0 上处理字符串注解时可启动失败。2.14.1 有针对性兼容修复;不要把它混同为所有 Python 3.10 或未定义类型名的问题。
应用还没接收请求,定义一个带字符串注解的模型就退出,报:
TypeError: ForwardRef.__init__() got an unexpected keyword argument 'is_class'
如果运行环境恰好是 Python 3.10.0 与 Pydantic 2.14.0,先检查这个小版本组合。Python 3.10.0 的 typing.ForwardRef 构造函数没有 is_class 参数,3.10.1 已有该参数;不能把“3.10”作为足够精确的版本记录。
一个字符串注解就能进入这条路径
下面的模型不涉及复杂递归,也不连接数据库:
from pydantic import BaseModel
class Model(BaseModel):
value: "int"
受影响版本在处理字符串注解时给 ForwardRef 传入了旧标准库不接受的参数。因此,给字段加默认值、调整请求 JSON,或者反复调用 model_rebuild(),都没有解决函数签名不兼容。
先在真实启动服务的解释器中查看完整版本,而不是只看终端里另一个 Python:
python -c 'import sys, pydantic; print(sys.version); print(sys.executable); print(pydantic.__version__)'
容器、后台 worker 和编辑器可使用不同解释器。只有其中一个环境更新了依赖,不能证明实际报错的进程已经切换。
Pydantic 2.14.1 已加入针对性兼容
正式的 Pydantic 2.14.1 在这个转换入口为 Python 3.10.0 单独省略 is_class,并在发行说明中列出了对应修复。如果应用依赖允许,可在隔离环境更新到包含修复的匹配版本组合,再用原模型与真实启动入口复查。
若暂时无法升级解释器或 Pydantic,可依据已有锁文件临时恢复此前正常的依赖组合;明确记录这是过渡措施,不要为了这个单点错误将所有环境盲目降级。更新 Python 本身时,应选择项目支持的维护分支,重新核对本地扩展与锁定依赖,而不是只在启动命令里换个名字。
不要修改 typing.py,也不要把项目全部字符串注解删掉。字符串注解可能承担前向引用的真实作用,删掉它们还会改变类型求值时机。
完成后检查模型导入、嵌套模型与应用实际使用的前向引用。若接下来出现 NameError、模型尚未定义或类型命名空间错误,应分别处理:这些错误不能由函数签名兼容修复自动消除。


