Mypy校验numpy.reshape输入类型时报错的正确类型标注方法咨询
错误原因
你触发mypy报错的核心原因是test方法的第二个参数b的类型标注不符合ndarray.reshape的入参类型要求:ndarray.reshape方法的第一个入参为目标形状,numpy类型存根定义的合法类型只有单个整数或整数组成的序列(如列表、元组),你当前将b标注为np.ndarray,没有匹配的重载实现,因此报错。
修改方案
根据你实际使用b的场景,有两种正确的标注方式:
场景1:b本身就是传递形状的整数/整数序列
直接修改b的类型标注即可,修改后代码如下:
import numpy as np from typing import Union, Sequence, Literal class TestClass(): def test(self, a: np.ndarray, b: Union[int, Sequence[int]]): return a.reshape(b, order = 'F')
场景2:b确实是存储形状值的一维整数numpy数组
你需要先将numpy数组转换为Python序列类型再传入reshape,同时使用numpy.typing标注数组的具体类型,修改后代码如下:
import numpy as np from typing import Union, Sequence, Literal import numpy.typing as npt class TestClass(): def test(self, a: np.ndarray, b: npt.NDArray[np.int_]): # 将numpy数组转为元组后再作为形状参数传入 return a.reshape(tuple(b), order = 'F')
如果需要进一步对order参数做更严格的类型限制,也可以将其显式标注为Literal['C', 'F', 'A']类型。
内容的提问来源于stack exchange,提问作者dmmpie
相关产品推荐
相关产品推荐

