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


9

我只整理了以下“最小”复制案例(最小引号,因为我想确保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()

当我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)

它声称这test.shape是不可下标的,即使很明显也是如此。当我运行代码时,它可以正常工作:

$> python pylint_error.py
1

那么,是什么导致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]))并没有修复错误
  • 指定dtypenp.array([1], dtype=np.uint8))并没有修复错误
  • 进行测试(test[:].shape)可消除错误

我的第一个直觉是,各种NumPY方法(arangevs,zerosvs full等)不一致的行为表明,这只是in的一个错误NumPY。但是,可能NumPY我误会了一些基本概念。我想确保我不会编写具有意外行为的未定义行为的代码。


1
我责怪pylintnumpy
hpaulj

Answers:


5

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

在问题最终解决之前,我只需要将行更改为

    print(test.shape[0])  # pylint: disable=E1136  # pylint/issues/3139

到我的pylintrc文件。


1
感谢您链接问题。不幸的是,我pylint 抱怨线路太长,所以我认为我可能会坚持使用print(test[:].shape[0])您的解决方案,因为这会使我的线路更短,并使我免于pylint不断的
困扰

2
注意:pylint的最新版本会警告您不要通过ID禁用,因此我建议在前一行中提供更多类似信息:# pylint: disable=unsubscriptable-object # pylint/issues/3139
Bryce Schober

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.