なぜ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など)での一貫性のない動作は、それがの単なるバグであることを示唆していると言いNumPYます。しかしNumPY、私が誤解しているいくつかの根本的な概念がある可能性があります。偶然にのみ機能する未定義の動作を伴うコードを記述しないようにしたいと思います。


1
私はpylint以前に非難したいですnumpy
hpaulj

回答:


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
ブライスショーバー

2

2019年11月現在:

上の議論でのユーザーのいずれかで述べたようにGitHubのあなたはダウングレードすることによって、問題を解決することができ、両方の pylintアステロイドの例では、requirements.txt

astroid>=2.0, <2.3
pylint>=2.3, <2.4

または

pip install astroid==2.2.5 & pip install pylint==2.3.1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.