MyPy配置允许numpy无类型调用仍报no-untyped-call错误怎么办?
配置不生效的核心原因
你在[mypy-numpy.*]块下配置的规则仅作用于numpy模块自身的代码检查逻辑,不会对你自己编写的业务代码生效。
你全局开启了disallow_untyped_calls = True,该规则会作用于所有你自己写的代码:只要MyPy检测到你调用了没有完整类型标注的函数,无论这个函数来自哪个第三方库,都会触发no-untyped-call报错。你遇到的报错就是因为当前环境下numpy的kron函数没有被MyPy识别到有效类型标注,和numpy模块自身的检查规则无关。
MyPy 配置作用域规则
MyPy的配置分为两类,作用域逻辑如下:
- 全局配置:定义在
[mypy]块下的所有配置,对所有被MyPy检查的代码生效,包括你自己的业务代码、你导入的第三方依赖的代码(如果MyPy开启了第三方库检查)。 - 按模块匹配的配置:定义在
[mypy-<模块匹配规则>]块下的配置,仅对匹配到的模块本身的代码生效,不会作用于其他模块中调用该模块的逻辑。比如你给numpy.*加的配置,只会在MyPy检查numpy源码本身的时候生效,对你的代码调用numpy的逻辑没有任何影响。
解决方案
你可以任选以下一种方案解决报错:
- 仅忽略当前行的报错:在调用
np.kron的代码行末尾添加注释# type: ignore[no-untyped-call],即可仅跳过当前行的无类型调用检查,不会影响其他代码的检查严格度,修改后代码如下:
distance_win: npt.NDArray[np.float32] = np.kron( np.ones((10, 1)) , np.ones((10, 1)) ) # type: ignore[no-untyped-call]
- 补全numpy的类型标注:安装numpy的补充类型包
types-numpy,安装命令为pip install types-numpy,安装后MyPy就能识别到np.kron的完整类型标注,不会再触发无类型调用报错,这是最推荐的方案,不会降低检查严格度。 - 全局关闭无类型调用检查:将全局配置里的
disallow_untyped_calls = True修改为False,不过该方案会放松所有代码的检查严格度,不推荐使用。
内容的提问来源于stack exchange,提问作者Bakkiaraj
相关产品推荐
相关产品推荐

