How do I annotate types in a for-loop?

PythonFor LoopPycharmType HintingPython Typing

Python Problem Overview


I want to annotate a type of a variable in a for-loop. I tried this but it didn't work:

for i: int in range(5):
    pass

What I expect is working autocomplete in PyCharm 2016.3.2, but using pre-annotation didn't work:

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

P.S. Pre-annotation works for PyCharm >= 2017.1.

Python Solutions


Solution 1 - Python

According to PEP 526, this is not allowed:

> In addition, one cannot annotate variables used in a for or with > statement; they can be annotated ahead of time, in a similar manner to > tuple unpacking

Annotate it before the loop:

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

PyCharm 2018.1 and up now recognizes the type of the variable inside the loop. This was not supported in older PyCharm versions.

Solution 2 - Python

I don't know if this solution is PEP-compatible or just a feature of PyCharm, but I made it work like this:

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

and I'm using Pycharm Community Edition 2016.2.1

Solution 3 - Python

This works well for my in PyCharm (using Python 3.6)

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

Solution 4 - Python

None of the responses here were useful, except to say that you can't. Even the accepted answer uses syntax from the PEP 526 document, which isn't valid python syntax. If you try to type in

x: int

You'll see it's a syntax error.

Here is a useful workaround:

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

Do your work with x. PyCharm recognizes its type, and autocomplete works.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiongrepcakeView Question on Stackoverflow
Solution 1 - PythonalecxeView Answer on Stackoverflow
Solution 2 - PythonDavid VasquezView Answer on Stackoverflow
Solution 3 - PythonSamirView Answer on Stackoverflow
Solution 4 - PythonEdward Ned HarveyView Answer on Stackoverflow