DEBUG.WIKI
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →
RackNerd;$21.99/年 · 1GB KVM

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、模型尚未定义或类型命名空间错误,应分别处理:这些错误不能由函数签名兼容修复自动消除。