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