Как аннотировать типы в цикле for

93

Я хочу аннотировать тип переменной в forцикле. Я пробовал это:

for i: int in range(5):
    pass

Но это явно не сработало.

Я ожидаю, что в PyCharm 2016.3.2 работает автозаполнение. Предварительная аннотация вроде этого:

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

не помогает.

PS Предварительная аннотация работает для PyCharm> = 2017.1

grepcake
источник
Просто замечание: обычно он вам не нужен, поскольку тип определяется функцией диапазона (это актуально для всех внутренних объявленных переменных)
gdoumenc

Ответы:

124

Согласно PEP 526 , это запрещено:

Кроме того, один не может аннотировать переменные , используемые в forили with заявлении ; они могут быть аннотированы заранее, аналогично распаковке кортежей

Аннотируйте его перед циклом:

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

PyCharm 2018.1 и выше теперь распознает тип переменной внутри цикла. Это не поддерживалось в более старых версиях PyCharm.

алексе
источник
1
Я пробовал, но похоже, что он не работает в последней стабильной версии PyCharm. По крайней мере, у меня нет автозаполнения.
grepcake
2
Я использую PyCharm 2018.1, и теперь он распознает эту форму.
филолог
2
@philologon здорово! Спасибо за внимание, обновил ответ соответственно.
alecxe 02
3
Но будет информация для проверки Local variable 'i' value is not used.
Simin Jie
1
In iпо- i: intпрежнему не будет использоваться, даже если вы используете его iв цикле. Я думаю, что это недостаток такой аннотации.
Simin Jie
38

Я не знаю, совместимо ли это решение с PEP или это просто функция PyCharm, но я заставил его работать так

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

и я использую Pycharm Community Edition 2016.2.1

Дэвид Васкес
источник
2
Спасибо, но я буду придерживаться варианта PEP 526
grepcake
Несмотря на то, что он не совместим с PEP 526, он работает в PyCharm (по крайней мере, с 2017.2.1) и имеет дополнительное преимущество, так как также работает в Python 3.0-3.5 (который не поддерживает синтаксис предварительной аннотации, представленный в Python 3.6).
феникс
4
К вашему сведению: этот формат явно разрешен / упомянут в PEP 484 (также должен быть совместим с python 2.7)
Клод
1
Это также действительный вариант согласно PEP 484
Марко,
Эта форма также работает с циклами for / enumerate и PyCharm 2018. напримерfor index, area in enumerate(area_list): # type: int, AreaInfo
simpleuser
13

Это хорошо работает для меня в PyCharm (с использованием Python 3.6)

for i in range(5):
    i: int = i
    pass
Самир
источник
Я думаю, что это должен быть принятый ответ, поскольку он делает именно то, что было запрошено, и не выдает других ошибок и / или предупреждений, в отличие от принятого в настоящее время.
Яни
2
MyPy действительно жалуется, если вы переопределяете переменную в цикле for
Джованни Ди Милия
3
Не переопределяйте переменную. i: intдостаточно, и вы не получите никаких жалоб.
user136036
-4

Ни один из ответов здесь не был полезным, за исключением того, что вы не могли. Даже в принятом ответе используется синтаксис из документа PEP 526, который не является допустимым синтаксисом Python. Если вы попытаетесь ввести

x: int

Вы увидите, что это синтаксическая ошибка.

Вот полезный обходной путь:

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

Делайте свою работу с помощью x. PyCharm распознает его тип, и автозаполнение работает.

Эдвард Нед Харви
источник
10
Это допустимый синтаксис, по крайней мере, для python 3.6. См. PEP 526
grepcake 06