我想知道为什么 mypy 在处理 numpy 时会产生这么多“从声明为返回的函数返回任何内容”错误。在下面的示例中,a
是一个数组,b
是一个标量。正如我所见,np.exp(a*x)除了另一个数组之外无法返回任何其他内容。即使x
是np.inf
,结果仍然是一个数组。那么为什么 mypy 认为该函数可以返回任何类型呢?
import numpy as np
from numpy.typing import NDArray
def func(a: NDArray[np.float64], x: float) -> NDArray[np.float64]:
return np.exp(a*x)
PS:使用 mypy --warn-return-any [file name]
检查上面的代码,然后你应该看到:
a.py:5: error: Returning Any from function declared to return "ndarray[Any, dtype[floating[_64Bit]]]" [no-any-return]
- python 3.10.8
- mypy 0.991
- numpy 1.24.0
最佳答案
问题似乎出在 a*x
上,而不是我最初猜测的 np.exp
。如果引入显式提示的临时变量,问题就会消失:
$ cat tmp.py
import numpy as np
from numpy.typing import NDArray
def func(a: NDArray[np.float64], x: float) -> NDArray[np.float64]:
y: NDArray[np.float64] = a*x
return np.exp(y)
$ mypy --warn-return-any tmp.py
Success: no issues found in 1 source file
为什么类型推断失败,我不确定。未能提示NDArray.__mul__
?
关于python - 标量/数组乘法返回任意类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75024288/