web-dev-qa-db-ja.com

配列を持つ関数の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)

関数の目的はもちろん、xdataの数の多い配列を解析することです。しかし、PyCharmはそれを知らないので、それ以上の指示がない限り、xdata(したがってydata)も整数であると想定します。

この警告に対処する適切な方法は何ですか?型チェック行を追加すると警告が修正されることに注意してください。それは最適なソリューションですか?例えば:

if not type(ydata) is np.ndarray:
    ydata = np.array(ydata)

最後に、Sphinx docstring情報を追加しても警告には影響がないようです。 (警告として、xdataがstrとして指定されている場合でも「int」が表示されます)。また、yを直接反復すると、次のエラーが直接発​​生します。

for y in ydata:
...
>> Expected 'collections.Iterable', got 'int' instead
15
Vince W.

Pycharmには type hinting 機能があるかもしれません。

たとえばこの場合、次のコードはエラーを解消します。

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バージョンには type annotations のサポートも含まれます

import numpy as np
def get_ydata(xdata: np.ndarray):
    ...
5
tzaman

TL; DR list()を使用してキャスト

まだ遅く、

他のコードでも同様の問題がありました。

私はそれと同じようなものでそれを解決できました

def get_ydata(xdata):
    ydata = list(xdata ** 2)
    for i in range(len(ydata)):
        print ydata[i]
    return ydata
0
Nilesh Kevlani