numpy sum方法mypy类型检查失败问题排查:是mypy Bug、numpy Bug还是代码问题?
问题分析与解答
首先可以明确:你的代码完全没问题,运行结果正确;这个报错既不算numpy的bug,也不是mypy的bug,本质是numpy的类型注解在这个场景下的精度不足,加上mypy暂时无法根据axis参数自动推导更精确的返回类型导致的。
具体原因拆解
- 代码逻辑正确性:当你调用
ndarray.sum(axis=0)时,确实会返回一个按列求和的ndarray,和整数2做取模操作在运行时完全合法,所以代码本身没有问题。 - mypy报错的根源:numpy对
sum方法的类型标注是Union[number[Any], ndarray]——这个标注是为了兼容两种场景:当不指定
axis(或axis=None)时,返回单个数值;当指定具体axis时,返回维度降低的ndarray。
但mypy目前没办法根据你传入的axis=0这个参数值,自动将返回类型从Union缩小到ndarray,所以它依然认为返回值可能是单个number[Any]类型。而mypy的类型检查规则中,number[Any]和int的取模操作没有被明确支持,因此抛出了类型错误。
临时解决办法
你可以通过类型断言告诉mypy返回值的具体类型,绕过这个检查:
- 使用
typing.cast明确指定类型:
from typing import cast import numpy arr_sum = cast(numpy.ndarray, numpy.array([[1,2,3],[4,5,6]]).sum(axis=0)) print(arr_sum % 2)
- 或者利用numpy的
view方法(本质也是类型提示):
import numpy result = numpy.array([[1,2,3],[4,5,6]]).sum(axis=0) print(result.view(numpy.ndarray) % 2)
另外,你也可以关注numpy和mypy的后续更新——随着numpy类型注解的完善,或者mypy对numpy类型推导的优化,这个问题可能会被自动修复。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

