Почему pylint возвращает `unsubscriptable-object` для numpy.ndarray.shape? - PullRequest
1 голос
/ 31 октября 2019

Я просто собрал следующий «минимальный» случай воспроизведения (минимум в кавычках, потому что я хотел, чтобы 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 против zeros против full)и т. д.) предполагает, что это просто ошибка в NumPY. Однако возможно, что в NumPY есть какая-то базовая концепция, которую я неправильно понимаю. Я хотел бы убедиться, что я не пишу код с неопределенным поведением, который работает только случайно.

1 Ответ

1 голос
/ 31 октября 2019

У меня недостаточно репутации, чтобы комментировать, но похоже, что это открытый вопрос: https://github.com/PyCQA/pylint/issues/3139

Пока проблема не будет решена, я просто изменил бы строку на

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

в мой pylintrc файл.

...