ChatGPT解决这个技术问题 Extra ChatGPT

How do I annotate types in a for-loop?

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.

Just a remark : Normally you should not need it as the type is deduced from the range function (this is relevant for all internal declared variables)

a
alecxe

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.


But there will be a inspect info Local variable 'i' value is not used.
@SiminJie yes, because this is just an example.
This also works well for for loops over something that is unpacked two multiple objects: e.g. key: str df: pd.DataFrame for key, df in myData.items(): ...
A
Alex Waygood

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


While not PEP 526 compliant, this does work in PyCharm (at least as of 2017.2.1) and has the added benefit of also working in Python 3.0-3.5 (which doesn't support pre-annotation syntax introduced in Python 3.6).
FYI: This format is explicitly allowed/mentioned in PEP 484 (also to be python 2.7 compatible)
This is also a valid option according to PEP 484
This form also works with for/enumerate loops and PyCharm 2018. e.g. for index, area in enumerate(area_list): # type: int, AreaInfo
S
Samir

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

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

I think this should be the accepted answer, as this does exactly what was requested and doesn't give out other errors and/or warnings, as opposed to the currently accepted one.
MyPy actually complains if you redefine the variable in the for loop
Do not redefine the variable. i: int is enough and you won't get any complaints.
An elegant option, to me this looks better to me specifying types in comments.
E
Edward Ned Harvey

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.


It is valid syntax,at least, for python 3.6. See PEP 526
Not exactly wrong but this is coding without love ;)