为什么 pylint 为 numpy.ndarray.shape 返回 `unsubscriptable-object`?

ste*_*esu 12 python numpy pylint

我只是将以下“最小”重现案例放在一起(最少用引号引起来,因为我想确保pylint不会抛出其他错误、警告、提示或建议——这意味着有一些样板文件):

pylint_error.py :

"""
Docstring
"""

import numpy as np


def main():
    """
    Main entrypoint
    """
    test = np.array([1])
    print(test.shape[0])


if __name__ == "__main__":
    main()

Run Code Online (Sandbox Code Playgroud)

当我运行pylint此代码 ( pylint pylint_error.py) 时,我得到以下输出:

$> pylint pylint_error.py
************* Module pylint_error
pylint_error.py:13:10: E1136: Value 'test.shape' is unsubscriptable (unsubscriptable-object)

------------------------------------------------------------------
Your code has been rated at 1.67/10 (previous run: 1.67/10, +0.00)
Run Code Online (Sandbox Code Playgroud)

它声称它test.shape是不可下标的,即使它很明显是。当我运行代码时,它工作得很好:

$> python pylint_error.py
1
Run Code Online (Sandbox Code Playgroud)

那么是什么导致pylint了困惑,我该如何解决呢?

一些补充说明:

  • 如果我np.arange(1)在错误消失时声明测试
  • 如果我宣布试验为np.zeros(1)np.zeros((1))np.ones(1),或np.ones((1))错误也不会消失
  • 如果我np.full((1), 1)在错误消失时声明测试
  • 指定类型(test: np.ndarray = np.array([1]))并没有修复错误
  • 指定 a dtype( np.array([1], dtype=np.uint8))不能修复错误
  • 进行一片测试 ( test[:].shape) 使错误消失

我的第一直觉是,各种NumPY方法(arangevs zerosvsfull等)的不一致行为表明它只是NumPY. 但是NumPY,我可能误解了一些潜在的概念。我想确定我不是在编写具有未定义行为的代码,这些行为只会在偶然情况下起作用。

mar*_*lli 8

我没有足够的声誉来发表评论,但看起来这是一个悬而未决的问题:https : //github.com/PyCQA/pylint/issues/3139

在他们最终解决问题之前,我只会将行更改为

    print(test.shape[0])  # pylint: disable=E1136  # pylint/issues/3139
Run Code Online (Sandbox Code Playgroud)

到我的pylintrc文件。

  • 注意:最新版本的 pylint 警告有关通过 ID 禁用的问题,因此我建议在前一行中使用类似这样的内容:`# pylint:disable=unsubscriptable-object # pylint/issues/3139` (2认同)