Pylint neden numpy.ndarray.shape için "abonelikten çıkarılabilir nesne" döndürüyor?


10

Ben sadece aşağıdaki "minimum" repro davayı bir araya getirdim (tırnak içinde minimum çünkü pylintbaşka hata, uyarı, ipucu veya öneri atmak emin olmak istedim - yani biraz kazan levhası var):

pylint_error.py :

"""
Docstring
"""

import numpy as np


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


if __name__ == "__main__":
    main()

Ben çalıştırdığınızda pylintbu kod (on pylint pylint_error.py) aşağıdaki çıktıyı almak:

$> 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.shapeOldukça açık olmasına rağmen, aboneliğin olmadığını iddia ediyor . Kod çalıştırdığımda gayet iyi çalışıyor:

$> python pylint_error.py
1

Peki pylintşaşkınlığa neden olan nedir ve nasıl düzeltebilirim?

Bazı ek notlar:

  • Ben testi bildirirseniz np.arange(1)hata ortadan kalkar
  • Ben testi olarak bildirirseniz np.zeros(1), np.zeros((1)), np.ones(1)veya np.ones((1))hata yok değil go away
  • Ben testi bildirirseniz np.full((1), 1)hata ortadan kalkar
  • (Türünü belirleme test: np.ndarray = np.array([1])etmez) değil hatayı düzeltmek
  • Bir belirtme dtype( np.array([1], dtype=np.uint8)etmez) değil hatayı düzeltmek
  • Bir test ( test[:].shape) dilimi almak hatayı ortadan kaldırır

İlk içgüdüm, çeşitli NumPYyöntemlerle ( arangevs zerosvs fullvs) tutarsız davranışın sadece bir hata olduğunu öne sürdüğünü söylüyor NumPY. Ancak NumPYyanlış anladığımın altında yatan bazı kavramlar olabilir . Sadece kaza üzerinde çalışan tanımsız davranışlarla kod yazmadığımdan emin olmak istiyorum.


1
Daha pylintönce suçluyorumnumpy
hpaulj

Yanıtlar:


5

Yorum yapmak için yeterli itibarım yok, ancak bu açık bir sorun gibi görünüyor: https://github.com/PyCQA/pylint/issues/3139

Sorun sonuna kadar çözülene kadar, satırı sadece

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

benim pylintrcdosyama.


1
Sorunu bağladığınız için teşekkür ederiz. Ne yazık ki pylint aynı zamanda satırların çok uzun olmasından şikayet ediyor, bu yüzden print(test[:].shape[0])benim hatları pylint
kısalttığı

2
NOT: Pylint'in son sürümleri kimlikle devre dışı bırakma konusunda uyarır, bu yüzden önceki satırda buna benzer bir şey öneriyorum:# pylint: disable=unsubscriptable-object # pylint/issues/3139
Bryce Schober

2

Kasım 2019 itibarıyla:

Üzerinde tartışmaya kullanıcıların biri tarafından belirtildiği gibi GitHub'dan Eğer downgrading sorununu çözebileceğini söyledi hem PyLint ve astroid , örneğinrequirements.txt

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

veya

pip install astroid==2.2.5 & pip install pylint==2.3.1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.