Mengapa pylint mengembalikan `unsubscriptable-object` untuk numpy.ndarray.shape?

9

Saya hanya mengumpulkan kasus repro "minimum" berikut (minimum dalam tanda kutip karena saya ingin memastikan pylinttidak ada kesalahan, peringatan, petunjuk, atau saran lain - artinya ada sedikit pelat baja):

pylint_error.py :

"""
Docstring
"""

import numpy as np


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


if __name__ == "__main__":
    main()

Ketika saya menjalankan pylintkode ini ( pylint pylint_error.py) saya mendapatkan output berikut:

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

Ia mengklaim bahwa test.shapeitu tidak dapat disubkripsikan, meskipun cukup jelas. Ketika saya menjalankan kode itu berfungsi dengan baik:

$> python pylint_error.py
1

Jadi apa yang menyebabkan pylintmenjadi bingung, dan bagaimana saya bisa memperbaikinya?

Beberapa catatan tambahan:

  • Jika saya menyatakan tes sebagai np.arange(1)kesalahan hilang
  • Jika saya menyatakan tes sebagai np.zeros(1), np.zeros((1)), np.ones(1), atau np.ones((1))kesalahan tidak tidak pergi
  • Jika saya menyatakan tes sebagai np.full((1), 1)kesalahan hilang
  • Menentukan tipe ( test: np.ndarray = np.array([1])) tidak memperbaiki kesalahan
  • Menentukan a dtype( np.array([1], dtype=np.uint8)) tidak memperbaiki kesalahan
  • Mengambil sepotong tes ( test[:].shape) membuat kesalahan hilang

Insting pertama saya mengatakan bahwa perilaku tidak konsisten dengan berbagai NumPYmetode ( arangevs zerosvs full, dll) menunjukkan itu hanya bug NumPY. Namun mungkin saja ada beberapa konsep yang mendasari NumPYbahwa saya salah paham. Saya ingin memastikan saya tidak menulis kode dengan perilaku tidak terdefinisi yang hanya berfungsi secara tidak sengaja.

stevendesu
sumber
1
Saya akan menyalahkan pylintsebelumnyanumpy
hpaulj

Jawaban:

5

Saya tidak memiliki reputasi yang cukup untuk berkomentar, tetapi sepertinya ini adalah masalah terbuka: https://github.com/PyCQA/pylint/issues/3139

Sampai masalah terselesaikan pada akhirnya, saya hanya akan mengubah jalurnya

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

ke pylintrcfile saya .

ignoring_gravity
sumber
1
Terima kasih telah menghubungkan masalah ini. Sayangnya pylint juga mengeluh tentang garis yang terlalu panjang, jadi saya pikir saya mungkin tetap dengan print(test[:].shape[0])solusi Anda karena membuat garis saya lebih pendek dan menyelamatkan saya dari pylintomelan terus-menerus
stevendesu
2
CATATAN: Versi terbaru pylint memperingatkan tentang penonaktifan oleh ID, jadi saya sarankan sesuatu yang lebih seperti ini di baris sebelumnya:# pylint: disable=unsubscriptable-object # pylint/issues/3139
Bryce Schober
2

Per November 2019:

Seperti yang disebutkan oleh salah satu pengguna dalam diskusi tentang GitHub Anda bisa menyelesaikan masalah dengan menurunkan prioritas kedua pylint dan astroid , misalnya direquirements.txt

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

atau

pip install astroid==2.2.5 & pip install pylint==2.3.1
Tomasz Bartkowiak
sumber