Comment annoter des types dans une boucle for

93

Je veux annoter un type de variable dans un for-loop. J'ai essayé ceci:

for i: int in range(5):
    pass

Mais cela n'a pas fonctionné, évidemment.

Ce que j'attends, c'est que la saisie semi-automatique fonctionne dans PyCharm 2016.3.2. Pré-annotation comme ceci:

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

n'aide pas.

PS Pre-annotation fonctionne pour PyCharm> = 2017.1

grepcake
la source
Juste une remarque: normalement, vous ne devriez pas en avoir besoin car le type est déduit de la fonction range (ceci est pertinent pour toutes les variables internes déclarées)
gdoumenc

Réponses:

124

Selon PEP 526 , ce n'est pas autorisé:

De plus, on ne peut pas annoter les variables utilisées dans une instruction fororwith ; ils peuvent être annotés à l'avance, de la même manière que le déballage de tuple

Annotez-le avant la boucle:

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

PyCharm 2018.1 et les versions ultérieures reconnaissent désormais le type de la variable à l'intérieur de la boucle. Cela n'était pas pris en charge dans les anciennes versions de PyCharm.

alecxe
la source
1
Je l'ai essayé, mais il ne semble pas fonctionner dans la dernière PyCharm stable. Je n'obtiens au moins aucune saisie semi-automatique.
grepcake
2
J'utilise PyCharm 2018.1 et il reconnaît maintenant ce formulaire.
philologon
2
@philologon sympa! Merci pour la mise à jour de la réponse en conséquence.
alecxe
3
Mais il y aura une info d'inspection Local variable 'i' value is not used.
Simin Jie
1
Le idans i: intne sera toujours pas utilisé même que vous utilisez idans la boucle. Je pense que c'est un défaut pour ce genre d'annotation.
Simin Jie
38

Je ne sais pas si cette solution est compatible PEP ou simplement une fonctionnalité de PyCharm mais je l'ai fait fonctionner comme ça

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

et j'utilise Pycharm Community Edition 2016.2.1

David Vasquez
la source
2
Merci, mais je m'en
tiendrai
Bien que non conforme à PEP 526, cela fonctionne dans PyCharm (au moins à partir de 2017.2.1) et présente l'avantage supplémentaire de fonctionner également en Python 3.0-3.5 (qui ne prend pas en charge la syntaxe de pré-annotation introduite dans Python 3.6).
phoenix
4
FYI: Ce format est explicitement autorisé / mentionné dans PEP 484 (également compatible avec python 2.7)
Claude
1
C'est également une option valide selon PEP 484
Marco
Ce formulaire fonctionne également avec les boucles for / enumerate et PyCharm 2018. par exemplefor index, area in enumerate(area_list): # type: int, AreaInfo
simpleuser
13

Cela fonctionne bien pour mon dans PyCharm (en utilisant Python 3.6)

for i in range(5):
    i: int = i
    pass
Samir
la source
Je pense que cela devrait être la réponse acceptée, car cela fait exactement ce qui a été demandé et ne donne pas d'autres erreurs et / ou avertissements, contrairement à celui actuellement accepté.
Jani Kärkkäinen
2
MyPy se plaint en fait si vous redéfinissez la variable dans la boucle for
Giovanni Di Milia
3
Ne redéfinissez pas la variable. i: intest suffisant et vous ne recevrez aucune plainte.
user136036
-4

Aucune des réponses ici n'était utile, sauf pour dire que vous ne pouvez pas. Même la réponse acceptée utilise la syntaxe du document PEP 526, qui n'est pas une syntaxe python valide. Si vous essayez de taper

x: int

Vous verrez que c'est une erreur de syntaxe.

Voici une solution de contournement utile:

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

Faites votre travail avec x. PyCharm reconnaît son type et la saisie semi-automatique fonctionne.

Edward Ned Harvey
la source
10
C'est au moins une syntaxe valide pour python 3.6. Voir PEP 526
grepcake