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


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.


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


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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.