Numba 跑 coverage 报 NumbaTracer 不接受 tool_id
Numba 的 JIT 覆盖率适配器若不接受 sysmon 传入的 tool_id,会在收集时崩溃。选择兼容 coverage 核心,并核对修补版本与报告含义。
Python 3.14 环境启用 NUMBA_JIT_COVERAGE=1 后,测试还没完成,coverage 收集过程就报 TypeError: NumbaTracer.__init__() got an unexpected keyword argument 'tool_id'。这通常需要核对 Numba 与 coverage 的跟踪器接口,而不是先修改被 njit 编译的业务函数。
一条明确组合使用 coverage 7.13.1,并采用 sysmon 核心。这个核心会在构造跟踪器的参数中加入 tool_id;旧 Numba 的覆盖率适配器没有声明该字段,直接转交参数后便失败。Numba 0.65.0 的正式实现仍没有这个字段,0.68.0 已有可选字段保护;这里不据此推断首次修复版本。
在原有 coverage 配置中选择兼容核心
若暂时不能调整 Numba 依赖,可先将 coverage 的收集核心改成 ctrace,让当前组合避开 sysmon 的这一项构造参数。使用 .coveragerc 的项目可在已有配置中加入:
[run]
core = ctrace
使用 pyproject.toml 的项目,对应设置为:
[tool.coverage.run]
core = "ctrace"
选择实际生效的一份配置,不要为了加这一项覆盖原来的 source、branch、omit 或上下文设置。coverage 7.13.1 的文档支持 ctrace、pytrace 和 sysmon;pytrace 也是可选的兼容路径,但应评估自己测试集的收集成本。
Python 3.14 上默认核心可能采用 sysmon,但命令行、配置和环境都会影响实际选择。以运行测试的同一个环境为准;仅在编辑器另一个解释器里检查版本,没有改变 CI 的收集过程。
更新依赖后,也要保留 JIT 覆盖率的含义
采用 Numba 0.68.0 等已有字段兼容的实现前,先核对 Python、NumPy、llvmlite 及项目锁文件的约束。不要仅为解决一个参数错误就强制安装不兼容的编译组件。
在隔离的测试输出中,保留原来的测试与 NUMBA_JIT_COVERAGE=1,确认覆盖率收集能结束、测试断言仍执行,并检查实际报告包含需要的 Python 包装层与 JIT 编译区域。关闭 JIT 覆盖率虽然可以让该分支不运行,却也会失去相应数据;如果采用它,应把缺失范围明确记入测试方案,不能沿用旧覆盖率口径。
Numba 的这项集成记录的是编译器访问到的源码行,不等同于每行机器码在运行时都被执行。编译期间被访问的分支,不能直接当成业务测试已走到的分支。因此,消除构造器异常以后,还需用测试断言验证业务结果,而不能只看一个升高的覆盖率百分比。
若切换核心后仍失败,先保留完整异常和实际配置。coverage.types 缺少类型、模块被同名文件遮蔽等错误属于其他入口,不能一概用 tool_id 的兼容方式处理;也不应在运行中的库对象上删除参数或临时猴子补丁,把依赖接口问题藏起来。


