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