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
(或通常大多数优化功能)因为 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: