类“bool”的意外未解析属性引用“all”

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

当我使用

numpy
(Python 3.12.1、numpy 1.26.4、PyCharm 2024.3.1(专业版))进行矩阵乘法时,我收到此警告,我认为这是错误的:

类“bool”的未解析属性引用“all”

证明: enter image description here

最小可重现示例

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")
python numpy pycharm
1个回答
0
投票

问题出在

==
运算符上。看来
numpy
库中的
numpy
类定义指定它返回带有类型提示的
Typing.Any
,因此 pycharm 假定它是
builtins.bool
的通常返回类型。

这是 pycharm 正在使用的

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()

Screenshot showing equality operator assumption of bool return type

重新排列并不能消除问题,而是通过非常清楚地指示您期望该操作的返回类型是什么,使下一个人出现并使用静态类型检查器检查您的代码时问题更加明显。

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()

Screenshot showing the error more clearly on its own line

您是否通过假设

Typing.Any
的返回类型是
builins.bool
来认为这是一个 pycharm 错误,还是通过在两个
numpy
之间的
Typing.Any
上提示
==
来认为这是一个
numpy.ndarray
错误错误由你决定。

这已经在

numpy
社区中讨论过,这似乎是 关于该主题的主要讨论

© www.soinside.com 2019 - 2024. All rights reserved.