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