为什么在不同的调用之间,传不传 --num-workers参数时,mypy 2.0的缓存会失效?

编程语言 2026-07-08

我在用mypy ~v2(具体是2.1.0)时发现,连续运行的mypy如果没有经过 --num-workers,因为缓存命中而很快;而连续运行的若经过 --num-workers 也因为缓存命中而很快。但是,当我在不带标志运行然后再带标志运行,或反过来时,似乎缓存被忽略了。这是怎么回事?

起初我没有注意到这种模式,总是在挠头,为什么在CI缓存预热、CI工作流使用缓存,以及本地pre-commit钩子/手动运行之间有时(现在我想我知道那个“有时”指的是什么)会忽略mypy缓存。

解决方案

所以,当我在升级mypy(我想之前用的是1.19)并尝试新的 --num-workers 标志时,错过的点在于它启用了一个新的解析器。如今不打算追踪mypy的源码来弄清楚这对缓存有什么影响,但直觉告诉我,不同解析器的运行结果在缓存上应当是不兼容的。

https://mypy.readthedocs.io/en/stable/changelog.html#parallel-type-checking

并行类型检查隐式启用新的本地解析器。并行和非并行模式之间仍存在一些较小的语义差异,我们将在未来的mypy版本中修复。

我希望这一点能更明显一些。也许只是我错过了本该让人一眼就明白的点。

我可以通过始终传递 --native-parser 来解决我的缓存未命中问题,或者始终传递 --num-workers / 设置 MYPY_NUM_WORKERS

在撰写本文时,似乎缓存文件路径使用的方式并不会对解析器进行区分。用一种解析器运行一次,然后再用另一种解析器运行,然后再次用第一种解析器运行时,第二次使用第一种解析器的回去缓存时并没有命中第一轮对该解析器的缓存(以上都没有显式传入缓存目录;我假设可以手动区分)。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章