¿Cómo anoto tipos en un bucle for?

93

Quiero anotar un tipo de variable en un forbucle. Probé esto:

for i: int in range(5):
    pass

Pero no funcionó, obviamente.

Lo que espero es autocompletar en PyCharm 2016.3.2. Pre-anotación como esta:

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

no ayuda.

PS Pre-anotación funciona para PyCharm> = 2017.1

grepcake
fuente
Solo un comentario: normalmente no debería necesitarlo ya que el tipo se deduce de la función de rango (esto es relevante para todas las variables declaradas internas)
gdoumenc

Respuestas:

124

Según PEP 526 , esto no está permitido:

Además, no se pueden anotar variables utilizadas en una declaración forowith ; se pueden anotar con anticipación, de manera similar al desembalaje de tuplas

Anótelo antes del bucle:

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

PyCharm 2018.1 y versiones posteriores ahora reconocen el tipo de variable dentro del bucle. Esto no fue compatible con versiones anteriores de PyCharm.

Alecxe
fuente
1
Lo intenté, pero parece que no funciona en el último PyCharm estable. No obtengo ningún autocompletado al menos.
grepcake
2
Estoy usando PyCharm 2018.1 y ahora reconoce este formulario.
filólogo
2
@philologon agradable! Gracias por el aviso, actualizó la respuesta en consecuencia.
alecxe
3
Pero habrá una información de inspección Local variable 'i' value is not used.
Simin Jie
1
El iin i: inttodavía no se usará incluso si lo usa ien el bucle. Creo que esto es un defecto para este tipo de anotación.
Simin Jie
38

No sé si esta solución es compatible con PEP o solo una característica de PyCharm, pero hice que funcionara así

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

y estoy usando Pycharm Community Edition 2016.2.1

David Vasquez
fuente
2
Gracias, pero me quedaré con la opción PEP 526
grepcake
Si bien no es compatible con PEP 526, funciona en PyCharm (al menos a partir de 2017.2.1) y tiene el beneficio adicional de funcionar también en Python 3.0-3.5 (que no admite la sintaxis de preanotación introducida en Python 3.6).
phoenix
4
FYI: Este formato está explícitamente permitido / mencionado en PEP 484 (también para ser compatible con Python 2.7)
Claude
1
Esta también es una opción válida de acuerdo con PEP 484
Marco
Este formulario también funciona con bucles for / enumerate y PyCharm 2018. egfor index, area in enumerate(area_list): # type: int, AreaInfo
simpleuser
13

Esto funciona bien para mi en PyCharm (usando Python 3.6)

for i in range(5):
    i: int = i
    pass
Samir
fuente
Creo que esta debería ser la respuesta aceptada, ya que hace exactamente lo que se solicitó y no da otros errores y / o advertencias, a diferencia de la aceptada actualmente.
Jani Kärkkäinen
2
MyPy en realidad se queja si redefine la variable en el bucle for
Giovanni Di Milia
3
No redefina la variable. i: intes suficiente y no recibirá ninguna queja.
user136036
-4

Ninguna de las respuestas aquí fue útil, excepto para decir que no puede. Incluso la respuesta aceptada usa la sintaxis del documento PEP 526, que no es una sintaxis válida de Python. Si intentas escribir

x: int

Verá que es un error de sintaxis.

Aquí hay una solución alternativa útil:

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

Haga su trabajo con x. PyCharm reconoce su tipo y el autocompletado funciona.

Edward Ned Harvey
fuente
10
Es una sintaxis válida, al menos, para python 3.6. Ver PEP 526
grepcake