Предупреждение pyCharm getitem для функций с массивами
Я получаю предупреждения проверки кода от PyCharm. Я понимаю логику, но я не знаю, как правильно ее исправить. Скажем, у меня есть следующая примерная функция:
def get_ydata(xdata):
ydata = xdata ** 2
for i in range(len(ydata)):
print ydata[i]
return ydata
Я получаю 2 предупреждения:
>> Expected type 'Sized', got 'int' instead (at line 3)
>> Class 'int' does not define '__getitem__', so the '[]' operator cannot be used on its instances (at line 4)
Целью функции является, разумеется, разбор массива numpy xdata. Но PyCharm этого не знает, поэтому без каких-либо дополнительных указаний предполагается, что xdata (и, следовательно, ydata) является целым числом.
Каким образом можно устранить это предупреждение? Я должен отметить, что добавление строки проверки типов исправит предупреждение. Это оптимальное решение? Например:
if not type(ydata) is np.ndarray:
ydata = np.array(ydata)
Наконец, добавление информации Docstring Sphinx, похоже, не влияет на предупреждения. (предупреждение все еще видит "int", когда xdata указывается как str). Кроме того, итерация по y приводит к следующей ошибке:
for y in ydata:
...
>> Expected 'collections.Iterable', got 'int' instead
Ответы
Ответ 1
Pycharm имеет функции подсказки типа, которые могут быть полезны.
Например, в этом случае следующий код устраняет ошибки:
import numpy as np
def get_ydata(xdata):
ydata = xdata ** 2 # type: np.ndarray
for i in range(len(ydata)):
print(ydata[i])
return ydata
Последние версии Python также включают поддержку аннотаций типов
import numpy as np
def get_ydata(xdata: np.ndarray):
...
Ответ 2
TL; DR Примените его, используя list()
Уже поздно,
У меня была похожая проблема с другим кодом.
Я мог бы решить это чем-то похожим на
def get_ydata(xdata):
ydata = list(xdata ** 2)
for i in range(len(ydata)):
print ydata[i]
return ydata