当我使用
numpy
(Python 3.12.1、numpy 1.26.4、PyCharm 2024.3.1(专业版))进行矩阵乘法时,我收到此警告,我认为这是错误的:
类“bool”的未解析属性引用“all”
最小可重现示例
import numpy as np
a_matrix = np.array([[1, 2], [3, 4]])
b_matrix = np.array([[10], [20]])
a = [5.0]
b = [2.0]
if ((a_matrix @ np.array([[round(a[0], 0)], [round(b[0], 0)]])) == b_matrix).all():
print("Success")
问题出在
==
运算符上。看来 numpy
库中的 numpy
类定义指定它返回带有类型提示的 Typing.Any
,因此 pycharm 假定它是 builtins.bool
的通常返回类型。
numpy
库中的行,复制以供上下文和后代使用:
def __eq__(self, other: Any, /) -> Any: ...
我通过创建自定义类并查看返回类型提示建议的内容及其完全匹配来确认
Typing.Any
提示会导致此问题。此代码运行时没有错误,原因与您的代码相同,它返回一个支持 numpy.ndarray
方法的 .all
。
from typing import Any
import numpy
class A:
def __eq__(self, other) -> Any:
return numpy.array([])
a = A()
(a == a).all()
重新排列并不能消除问题,而是通过非常清楚地指示您期望该操作的返回类型是什么,使下一个人出现并使用静态类型检查器检查您的代码时问题更加明显。
from typing import Any
import numpy
class A:
def __eq__(self, other) -> Any:
return numpy.array([])
a = A()
equal_result: numpy.ndarray = a == a
equal_result.all()
您是否通过假设
Typing.Any
的返回类型是 builins.bool
来认为这是一个 pycharm 错误,还是通过在两个 numpy
之间的 Typing.Any
上提示 ==
来认为这是一个 numpy.ndarray
错误错误由你决定。
这已经在
numpy
社区中讨论过,这似乎是 关于该主题的主要讨论。