forループで型に注釈を付けるにはどうすればよいですか


99

for-loop内の変数のタイプに注釈を付けたい。私はこれを試しました:

for i: int in range(5):
    pass

しかし、明らかにそれは機能しませんでした。

私が期待しているのは、PyCharm2016.3.2でオートコンプリートが機能していることです。このような事前注釈:

i: int
for i in range(5):
    pass

助けにはなりません。

PSプレアノテーションはPyCharm> = 2017.1で機能します


ただの注意:タイプは範囲関数から推定されるため、通常は必要ありません(これはすべての内部宣言変数に関連します)
gdoumenc 2010年

回答:


131

PEP 526によると、これは許可されていません。

さらにfororwith ステートメントで使用される変数に注釈を付けることはできません。タプルの解凍と同様の方法で、事前に注釈を付けることができます

ループの前に注釈を付けます。

i: int
for i in range(5):
    pass

PyCharm 2018.1以降は、ループ内の変数のタイプを認識するようになりました。これは古いPyCharmバージョンではサポートされていませんでした。


1
試しましたが、最後の安定したPyCharmでは動作していないようです。少なくともオートコンプリートはありません。
grepcake 2017年

2
PyCharm 2018.1を使用していますが、このフォームを認識します。
philologon

2
@philologonいいね!ヘッドアップをありがとう、それに応じて答えを更新しました。
alecxe 2018

3
しかし、検査情報がありLocal variable 'i' value is not usedます。
SiminJie19年

1
i中には、i: intまだあなたが使用しても使用されることはありませんiループで。これはこの種の注釈の欠陥だと思います。
SiminJie19年

39

このソリューションがPEP互換なのか、それともPyCharmの機能なのかはわかりませんが、このように機能させました

for i in range(5): #type: int
  pass

そして私はPycharmCommunity Edition2016.2.1を使用しています


2
ありがとうございますが、PEP 526オプションに固執します
grepcake 2017

PEP 526に準拠していませんが、これはPyCharmで機能し(少なくとも2017.2.1の時点で)、Python 3.0-3.5(Python 3.6で導入されたプレアノテーション構文をサポートしていません)でも機能するという追加の利点があります。
フェニックス

5
参考:この形式は、PEP 484で明示的に許可/言及されています(Python 2.7互換でもあります)
Claude

1
これは、PEP 484
Marco

このフォームは、for /列挙ループおよびfor index, area in enumerate(area_list): # type: int, AreaInfo
PyCharm2018

13

これはPyCharmでうまく機能します(Python3.6を使用)

for i in range(5):
    i: int = i
    pass

現在受け入れられているものとは対照的に、これは要求されたものを正確に実行し、他のエラーや警告を出さないため、これは受け入れられた答えであるべきだと思います。
ヤニKärkkäinen

2
forループで変数を再定義すると、MyPyは実際に文句を言います
Giovanni

3
変数を再定義しないでください。i: int十分であり、苦情はありません。
user1360 3620年

-4

ここでの回答はどれも役に立ちませんでした。受け入れられた回答でさえ、有効なPython構文ではないPEP526ドキュメントの構文を使用しています。入力しようとすると

x: int

構文エラーであることがわかります。

便利な回避策は次のとおりです。

for __x in range(5):
    x = __x  # type: int
    print(x)

で作業を行いxます。PyCharmはそのタイプを認識し、オートコンプリートが機能します。


10
これは、少なくともpython3.6では有効な構文です。参照PEP 526
grepcake

1
正確には間違っていませんが、これは愛のないコーディングです;)
Leo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.