Como faço para anotar tipos em um loop for

100

Eu quero anotar um tipo de variável em um forloop. Eu tentei isso:

for i: int in range(5):
    pass

Mas não funcionou, obviamente.

O que eu espero é o autocomplete funcionando no PyCharm 2016.3.2. Pré-anotação como esta:

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

não ajuda.

A pré-anotação PS funciona para PyCharm> = 2017.1

grepcake
fonte
Apenas uma observação: normalmente você não deve precisar dele, pois o tipo é deduzido da função de intervalo (isso é relevante para todas as variáveis ​​declaradas internas)
gdoumenc

Respostas:

133

De acordo com PEP 526 , isso não é permitido:

Além disso, não se pode anotar variáveis ​​usadas em uma instrução forouwith ; eles podem ser anotados com antecedência, de maneira semelhante ao desempacotamento de tupla

Anote antes do loop:

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

O PyCharm 2018.1 e superior agora reconhece o tipo da variável dentro do loop. Isso não era compatível com as versões mais antigas do PyCharm.

Alecxe
fonte
1
Eu tentei, mas não parece estar funcionando no último PyCharm estável. Eu não recebo nenhum preenchimento automático, pelo menos.
grepcake
2
Estou usando o PyCharm 2018.1 e agora ele reconhece este formulário.
philologon
2
@philologon legal! Obrigado pelo aviso, atualizou a resposta em conformidade.
alecxe
3
Mas haverá uma informação de inspeção Local variable 'i' value is not used.
Simin Jie
1
O ino i: intainda não serão usados mesmo que você usa ino circuito. Acho que isso é uma falha para esse tipo de anotação.
Simin Jie
39

Não sei se esta solução é compatível com PEP ou apenas um recurso do PyCharm mas fiz funcionar assim

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

e estou usando o Pycharm Community Edition 2016.2.1

David Vasquez
fonte
2
Obrigado, mas vou ficar com a opção PEP 526
grepcake
Embora não seja compatível com PEP 526, isso funciona no PyCharm (pelo menos a partir de 2017.2.1) e tem o benefício adicional de também funcionar no Python 3.0-3.5 (que não oferece suporte à sintaxe de pré-anotação introduzida no Python 3.6).
Phoenix
5
Para sua informação: este formato é explicitamente permitido / mencionado no PEP 484 (também para ser compatível com Python 2.7)
Claude
1
Esta também é uma opção válida de acordo com o PEP 484
Marco de
Este formulário também funciona com loops para / enumerar e PyCharm 2018. egfor index, area in enumerate(area_list): # type: int, AreaInfo
simpleuser
13

Isso funciona bem para mim no PyCharm (usando Python 3.6)

for i in range(5):
    i: int = i
    pass
Samir
fonte
Acho que esta deve ser a resposta aceita, pois faz exatamente o que foi solicitado e não emite outros erros e / ou avisos, ao contrário do aceito atualmente.
Jani Kärkkäinen
2
Na verdade, o MyPy reclama se você redefinir a variável no loop for
Giovanni Di Milia
3
Não redefina a variável. i: inté o suficiente e você não receberá nenhuma reclamação.
user136036
-4

Nenhuma das respostas aqui foi útil, exceto para dizer que você não pode. Mesmo a resposta aceita usa a sintaxe do documento PEP 526, que não é uma sintaxe Python válida. Se você tentar digitar

x: int

Você verá que é um erro de sintaxe.

Esta é uma solução alternativa útil:

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

Faça seu trabalho com x. O PyCharm reconhece seu tipo e o preenchimento automático funciona.

Edward Ned Harvey
fonte
10
É uma sintaxe válida, pelo menos, para o python 3.6. Ver PEP 526
grepcake
1
Não exatamente errado, mas isso é codificação sem amor;)
Leão