Подтвердить что ты не робот

Предупреждение 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
4b9b3361

Ответ 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