python - 标量/数组乘法返回任意类型

标签 python python-3.x numpy mypy typing

我想知道为什么 mypy 在处理 numpy 时会产生这么多“从声明为返回的函数返回任何内容”错误。在下面的示例中,a 是一个数组,b 是一个标量。正如我所见,np.exp(a*x)除了另一个数组之外无法返回任何其他内容。即使xnp.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/

相关文章:

pandas - 如何在 PIL 逊相关性计算过程中去掉 'ValueError: all the input array dimensions for the concatenation axis must match exactly'?

python - 处理(排队)对调用速率受限的外部 API 的 Web 服务的请求

python - 类型错误 : __init__() takes 1 positional argument but 2 were given

linux - os.read 在 inotify 文件描述符 : reading 32 bytes works but 31 raises an exception 上

python - 如何在列表中找到小于 n 的 2 的最高幂?

python - 检查列表中的拆分文本成员资格后如何从数据框中删除行?

python - 为什么 matplotlib imshow() 显示转置图像?

python - 导航到 PyCharm 中的特定模块

python - matplotlib 中的标准化颜色映射到底发生了什么?

python - 使用 cython 并行化 python 循环 numpy.searchsorted