为何无法将NDArray类型变量传入np.save?Pylance类型检查报错
Pylance对numpy.save报“Type partially unknown”警告的原因与解决办法
问题重现
以下代码在开启Pylance严格类型检查时会触发警告:
import numpy as np from numpy.typing import NDArray this_seems_to_be_causing_the_issue: NDArray[np.float32] = np.array([1,2,3], dtype=np.float32) np.save("i_think_anything_can_go_here", this_seems_to_be_causing_the_issue)
警告信息:
Type of "save" is partially unknown Type of "save" is "(file: str | PathLike[str] | _SupportsWrite[bytes], arr: _SupportsArray[dtype[Unknown]] | _NestedSequence[_SupportsArray[dtype[Unknown]]] | bool | int | float | complex | str | bytes | _NestedSequence[bool | int | float | complex | str | bytes], allow_pickle: bool = ..., fix_imports: bool = ...) -> None"
原因说明
这不是你的操作问题,属于numpy旧版本的类型注解缺陷,结合Pylance严格检查规则导致的:
- numpy 1.23.5的
np.save类型定义中,arr参数的dtype[Unknown]是未明确的类型占位符,Pylance在严格模式下会将其识别为“部分未知类型”。 - 即使改用
NDArray[Any]或移除变量类型提示,由于函数本身的类型注解存在问题,警告仍会触发。
解决办法
1. 升级numpy版本(推荐)
numpy 1.24及以上版本修复了该类型注解问题,升级后Pylance可正确识别np.save的完整类型,警告自动消失。执行升级命令:
pip install --upgrade numpy
2. 临时抑制警告
若暂时无法升级numpy,可通过单行注释精准抑制该警告:
import numpy as np from numpy.typing import NDArray this_seems_to_be_causing_the_issue: NDArray[np.float32] = np.array([1,2,3], dtype=np.float32) # type: ignore[unknown-type] np.save("i_think_anything_can_go_here", this_seems_to_be_causing_the_issue)
也可在文件顶部添加注释关闭整个文件的未知成员类型检查,但会影响其他代码的检查精度,不推荐大范围使用:
# pyright: reportUnknownMemberType=false import numpy as np from numpy.typing import NDArray
3. 手动适配类型注解(备选)
通过类型别名手动覆盖np.save的类型定义,规避旧版本的类型缺陷:
import numpy as np from numpy.typing import NDArray from typing import Callable, Any # 定义兼容的类型别名 NumpySaveFunc = Callable[[str, Any, bool, bool], None] np_save: NumpySaveFunc = np.save this_seems_to_be_causing_the_issue: NDArray[np.float32] = np.array([1,2,3], dtype=np.float32) np_save("i_think_anything_can_go_here", this_seems_to_be_causing_the_issue)
内容的提问来源于stack exchange,提问作者samgiz
相关产品推荐
相关产品推荐

