Wie kommentiere ich Typen in einer for-Schleife?

98

Ich möchte einen Variablentyp in einer forSchleife mit Anmerkungen versehen. Ich habe es versucht:

for i: int in range(5):
    pass

Aber es hat offensichtlich nicht funktioniert.

Was ich erwarte, ist die automatische Vervollständigung in PyCharm 2016.3.2. Voranmerkung wie folgt:

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

hilft nicht.

PS Die Voranmerkung funktioniert für PyCharm> = 2017.1

Grepcake
quelle
Nur eine Bemerkung: Normalerweise sollten Sie es nicht benötigen, da der Typ aus der Bereichsfunktion abgeleitet wird (dies ist für alle internen deklarierten Variablen relevant)
gdoumenc

Antworten:

130

Nach PEP 526 ist dies nicht zulässig:

Außerdem kann man keine Variablen kommentieren, die in einer foroder with -Anweisung verwendet werden . Sie können vorab mit Anmerkungen versehen werden, ähnlich wie beim Auspacken von Tupeln

Kommentieren Sie es vor der Schleife:

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

PyCharm 2018.1 und höher erkennt jetzt den Typ der Variablen in der Schleife. Dies wurde in älteren PyCharm-Versionen nicht unterstützt.

Alecxe
quelle
1
Ich habe es versucht, aber es scheint im letzten stabilen PyCharm nicht zu funktionieren. Ich bekomme zumindest keine automatische Vervollständigung.
Grepcake
2
Ich verwende PyCharm 2018.1 und es erkennt jetzt dieses Formular.
Philologon
2
@philologon schön! Vielen Dank für Heads-Ups, die Antwort entsprechend aktualisiert.
Alecxe
3
Aber es wird eine Inspektionsinformation geben Local variable 'i' value is not used.
Simin Jie
1
Das iIn i: intwird auch dann nicht verwendet, wenn Sie es iin der Schleife verwenden. Ich denke, das ist ein Fehler für diese Art von Annotation.
Simin Jie
39

Ich weiß nicht, ob diese Lösung PEP-kompatibel ist oder nur eine Funktion von PyCharm, aber ich habe dafür gesorgt, dass es so funktioniert

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

und ich verwende Pycharm Community Edition 2016.2.1

David Vasquez
quelle
2
Vielen Dank, aber ich bleibe bei der Option PEP 526
grepcake
Obwohl dies nicht PEP 526-kompatibel ist, funktioniert dies in PyCharm (mindestens ab 2017.2.1) und hat den zusätzlichen Vorteil, dass es auch in Python 3.0-3.5 funktioniert (das die in Python 3.6 eingeführte Voranmerkungssyntax nicht unterstützt).
Phoenix
5
Zu Ihrer Information: Dieses Format ist ausdrücklich in PEP 484 erlaubt / erwähnt (auch um mit Python 2.7 kompatibel zu sein)
Claude
1
Dies ist auch eine gültige Option gemäß PEP 484
Marco
Dieses Formular funktioniert auch mit for / enumerate-Schleifen und PyCharm 2018. zBfor index, area in enumerate(area_list): # type: int, AreaInfo
simpleuser
13

Dies funktioniert gut für meine in PyCharm (mit Python 3.6)

for i in range(5):
    i: int = i
    pass
Samir
quelle
Ich denke, dies sollte die akzeptierte Antwort sein, da dies genau das tut, was angefordert wurde, und keine anderen Fehler und / oder Warnungen ausgibt, im Gegensatz zu der derzeit akzeptierten.
Jani Kärkkäinen
2
MyPy beschwert sich tatsächlich, wenn Sie die Variable in der for-Schleife neu definieren
Giovanni Di Milia
3
Definieren Sie die Variable nicht neu. i: intist genug und Sie werden keine Beschwerden bekommen.
user136036
-4

Keine der Antworten hier war nützlich, außer zu sagen, dass Sie nicht können. Sogar die akzeptierte Antwort verwendet die Syntax aus dem PEP 526-Dokument, die keine gültige Python-Syntax ist. Wenn Sie versuchen einzugeben

x: int

Sie werden sehen, dass es sich um einen Syntaxfehler handelt.

Hier ist eine nützliche Problemumgehung:

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

Mach deine Arbeit mit x. PyCharm erkennt seinen Typ und die automatische Vervollständigung funktioniert.

Edward Ned Harvey
quelle
10
Zumindest für Python 3.6 ist die Syntax gültig. Siehe PEP 526
Grepcake
1
Nicht gerade falsch, aber das ist Codierung ohne Liebe;)
Leo