为什么 Pycharm 难以处理可返回多个输出的 Scipy 函数?

问题描述 投票:0回答:1

Scipy 是 Python 中最常用的科学包之一。它的大多数函数都有一个公共接口:它们要么只返回一个值(可以是

float/np.ndarray
),要么返回
tuple
,其中第二项是
boolean
dict
。像这样的东西:

value = some_scipy_function(*args, full_output=False)
value, flag = some_scipy_function(*args, full_output=True)

但是,如果您使用 PyCharm,它会不断地 发出针对 SciPy 函数的警告,因为它不知道如果

full_output
False
,这些函数确实会返回单个值。


为什么 PyCharm 做到这一点这么难?此信息不仅在 SciPy 函数的文档字符串中可用,而且在执行之前从代码中也很明显。此外,它通常不允许您像其他警告一样抑制这些警告,也许是因为它们被视为主要警告(不可能从元组中减去)。

抛开沮丧不谈,我觉得有点奇怪的是,如果你使用Python最常用的科学计算库,你的文件会因此充满无法抑制的警告。我是唯一一个对此感到沮丧的人吗?


示例

  • logsumexp
    (或通常大多数线性代数函数)
  • brentq
    (或通常大多数优化功能)
python scipy pycharm
1个回答
0
投票

因为 PyCharm 无法推断返回类型是可变的,因为 SciPy 不附带类型存根(PyCharm 也不在内部提供它们),这些存根将定义 (对于

logsumexp
,作为示例)仅通过文档字符串记录

退货

res:ndarray 结果,

np.log(np.sum(np.exp(a)))
以数值计算 更稳定的方式。如果给出
b
np.log(np.sum(b*np.exp(a)))
已返回。

sgn:ndarray 如果 return_sign 为 True,这将是一个浮点数组 匹配 res 和 +1、0 或 -1 的数字(具体取决于符号) 结果。如果为 False,则仅返回一个结果。

添加此类类型注释的机制是 @typing.overload;类似的东西

@overload
def logsumexp(..., return_sign=True) -> tuple[ndarray, bool]:

@overload
def logsumexp(..., return_sign=False) -> ndarray:
© www.soinside.com 2019 - 2024. All rights reserved.