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

如何使用mypyc编译Pydantic BaseModel?报错与可行性咨询

能否用mypyc编译继承Pydantic BaseModel的类?

问题背景

在已执行pip install -U pydantic mypy的环境中,创建test_basemodel.py文件,代码如下:

from pydantic import BaseModel

class A(BaseModel):
    pass

运行命令mypyc test_basemodel.py后出现编译报错,错误信息如下:

running build_ext
building 'test_basemodel' extension
x86_64-linux-gnu-gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -fPIC -I/home/guy/repos/DeepracerService/src/local/processor/.venv/lib/python3.12/site-packages/mypyc/lib-rt -I/home/guy/repos/DeepracerService/src/local/processor/.venv/include -I/usr/include/python3.12 -c build/__native.c -o build/temp.linux-x86_64-cpython-312/build/__native.o -O3 -g1 -Werror -Wno-unused-function -Wno-unused-label -Wno-unreachable-code -Wno-unused-variable -Wno-unused-command-line-argument -Wno-unknown-warning-option -Wno-unused-but-set-variable -Wno-ignored-optimization-argument -Wno-cpp
build/__native.c: In function ‘CPyDef___top_level__’:
build/__native.c:130:16: error: ‘CPyModule_pydantic___main’ undeclared (first use in this function); did you mean ‘CPyModule_pydantic’?
  130 |     cpy_r_r9 = CPyModule_pydantic___main;
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~
      |                CPyModule_pydantic
build/__native.c:130:16: note: each undeclared identifier is reported only once for each function it appears in
build/__native.c: At top level:
cc1: note: unrecognized command-line option ‘-Wno-ignored-optimization-argument’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unknown-warning-option’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics

根据mypyc官方文档中的说明:

大多数非原生类无法作为基类

虽然Pydantic与mypy(非mypyc)配合良好,且mypy与mypyc关联紧密,但目前找不到二者兼容的明确文档,想确认是否可以使用mypyc编译继承Pydantic BaseModel的类?


回答

目前无法直接用mypyc编译继承Pydantic BaseModel的类,核心原因是mypyc的原生类系统限制:

  • mypyc编译的类属于原生类,这类类在编译时会被转换为C扩展代码,要求基类必须也是mypyc编译的原生类,或是少数官方支持的内置类。
  • Pydantic的BaseModel是纯Python实现的非原生类,不符合mypyc对基类的要求,编译时出现的CPyModule_pydantic___main未声明错误,本质是mypyc无法处理非原生类的继承关系。

如果想用mypyc加速包含Pydantic的代码,可采用以下替代方案:

  • 将Pydantic相关代码保留为纯Python,仅对其他无原生类依赖限制的逻辑用mypyc编译。
  • 拆分代码结构,让继承BaseModel的类不参与mypyc编译,仅对调用这些类的业务逻辑部分进行编译。

需要注意的是,mypyc和mypy虽共享类型检查能力,但mypyc的编译能力有严格的原生类限制,并非所有能通过mypy类型检查的代码都能被mypyc编译。


内容的提问来源于stack exchange,提问作者GDub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:06:15