Чому pylint повертає "не підписуваний об'єкт" для numpy.ndarray.shape?


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])) не виправляє помилку
  • Вказання dtype( np.array([1], dtype=np.uint8)) не виправляє помилку
  • Якщо взяти фрагмент тесту ( test[:].shape), помилка усунеться

Мій перший інстинкт говорить про те, що непослідовна поведінка з різними NumPYметодами ( arangeпроти zerosvs fullтощо) говорить про те, що це просто помилка NumPY. Однак можливо, є якась основна концепція, NumPYяку я не розумію. Я хотів би бути впевненим, що я не пишу код з невизначеною поведінкою, який працює лише у випадку випадковості.


1
Я б звинувачував pylintранішеnumpy
hpaulj

Відповіді:


5

У мене недостатньо репутації для коментарів, але, схоже, це відкрите питання: https://github.com/PyCQA/pylint/isissue/3139

Поки питання не буде вирішено в їх кінці, я просто зміню рядок на

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

до мого pylintrcфайлу.


1
Дякуємо за зв’язок із проблемою. На жаль, скаржиться pylint також на те, що рядки занадто довгі, тому я думаю, що я можу дотримуватися print(test[:].shape[0])вашого рішення, оскільки це робить мої лінії коротшими та врятує мене від pylintневпинного
нанизування

2
ПРИМІТКА. Останні версії pylint попереджають про відключення ідентифікатора, тому я рекомендую щось подібне у попередньому рядку:# pylint: disable=unsubscriptable-object # pylint/issues/3139
Брайс Шобер,

2

Станом на листопад 2019 року:

Як зазначив один з користувачів в обговоренні 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.