¿Cómo anoto tipos en un bucle for?

3 minutos de lectura

avatar de usuario
grepcake

Quiero anotar un tipo de variable en un for-círculo. Intenté esto pero no funcionó:

for i: int in range(5):
    pass

Lo que espero es que funcione el autocompletado en PyCharm 2016.3.2, pero el uso de la anotación previa no funcionó:

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

La anotación previa de PS funciona para PyCharm >= 2017.1.

  • 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 internas declaradas)

    – gdoumenc

    2 de junio de 2020 a las 9:06


avatar de usuario
alejandro

De acuerdo a PEP 526Esto no esta permitido:

Además, uno no puede anotar variables utilizadas en un for o with
declaración
; se pueden anotar con anticipación, de manera similar al desempaquetado de tuplas

Anótalo antes del bucle:

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

PyCharm 2018.1 y posteriores ahora reconoce el tipo de la variable dentro del ciclo. Esto no fue compatible con versiones anteriores de PyCharm.

  • Pero habrá una información de inspección. Local variable 'i' value is not used.

    – Nube

    23 de enero de 2019 a las 12:57

  • @SiminJie sí, porque esto es solo un ejemplo.

    – alecxe

    23 de enero de 2019 a las 13:02

  • Esto también funciona bien para bucles sobre algo que se desempaqueta dos objetos múltiples: por ejemplo key: str df: pd.DataFrame for key, df in myData.items(): ...

    – topher217

    17 de julio de 2021 a las 5:23


avatar de usuario
david vasquez

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

  • Si bien no es compatible con PEP 526, esto funciona en PyCharm (al menos a partir de 2017.2.1) y tiene el beneficio adicional de que también funciona en Python 3.0-3.5 (que no admite la sintaxis previa a la anotación introducida en Python 3.6).

    – fénix

    13 de agosto de 2017 a las 12:24


  • FYI: este formato está explícitamente permitido/mencionado en PEP 484 (también para ser compatible con Python 2.7)

    – Claudio

    14/09/2018 a las 10:56


  • Esta es también una opción válida según PEP 484

    – marco

    11 de febrero de 2019 a las 7:50


  • Este formulario también funciona con bucles for/enumerate y PyCharm 2018. p. for index, area in enumerate(area_list): # type: int, AreaInfo

    – usuario simple

    4 de noviembre de 2019 a las 3:49


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

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

  • Creo que esta debería ser la respuesta aceptada, ya que hace exactamente lo que se solicitó y no muestra otros errores y/o advertencias, a diferencia de la actualmente aceptada.

    – Jani Kärkkäinen

    12 de agosto de 2019 a las 6:56

  • MyPy en realidad se queja si redefine la variable en el ciclo for

    – Giovanni Di Milia

    26 sep 2019 a las 16:05

  • No redefina la variable. i: int es suficiente y no obtendrá ninguna queja.

    – usuario136036

    6 de marzo de 2020 a las 13:03

  • Una opción elegante, a mi me parece mejor especificando tipos en comentarios.

    – Vlad Iliescu

    28 de junio a las 9:59

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

x: int

Verás que es un error de sintaxis.

Aquí hay una solución útil:

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

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

¿Ha sido útil esta solución?