Jak opisywać typy w pętli for

93

Chcę dodać adnotację do typu zmiennej w for-pętli. Próbowałem tego:

for i: int in range(5):
    pass

Ale to oczywiście nie zadziałało.

Oczekuję, że działa autouzupełnianie w PyCharm 2016.3.2. Adnotacja wstępna, taka jak ta:

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

nie pomaga.

PS Pre-adnotation działa dla PyCharm> = 2017.1

grepcake
źródło
Tylko uwaga: zwykle nie powinieneś tego potrzebować, ponieważ typ jest wywnioskowany z funkcji zakresu (dotyczy to wszystkich zadeklarowanych zmiennych wewnętrznych)
gdoumenc

Odpowiedzi:

124

Zgodnie z PEP 526 nie jest to dozwolone:

Ponadto nie możnaforwith dodawać adnotacji do zmiennych użytych w instrukcji lub ; można je opatrzyć adnotacjami z wyprzedzeniem, podobnie jak przy rozpakowywaniu krotek

Opisz to przed pętlą:

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

PyCharm 2018.1 i nowsze rozpoznają teraz typ zmiennej wewnątrz pętli. Nie było to obsługiwane w starszych wersjach PyCharm.

alecxe
źródło
1
Próbowałem, ale wygląda na to, że nie działa w ostatnim stabilnym PyCharm. Przynajmniej nie otrzymuję żadnego autouzupełniania.
grepcake
2
Używam PyCharm 2018.1 i teraz rozpoznaje ten formularz.
filologon
2
@philologon nice! Dzięki za ostrzeżenie, odpowiednio zaktualizowałem odpowiedź.
alecxe
3
Ale będzie inspekcja informacji Local variable 'i' value is not used.
Simin Jie
1
iW i: intnie nadal być stosowane nawet użyć iw pętli. Myślę, że jest to wada tego rodzaju adnotacji.
Simin Jie
38

Nie wiem, czy to rozwiązanie jest kompatybilne z PEP, czy po prostu jest funkcją PyCharm, ale tak to zrobiłem

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

i używam Pycharm Community Edition 2016.2.1

David Vasquez
źródło
2
Dziękuję, ale pozostanę przy opcji PEP 526
grepcake
Chociaż nie jest to zgodne z PEP 526, działa w PyCharm (przynajmniej od 2017.2.1) i ma dodatkową zaletę, że działa również w Pythonie 3.0-3.5 (który nie obsługuje składni poprzedzającej adnotację wprowadzonej w Pythonie 3.6).
feniks
4
Do Twojej wiadomości: ten format jest wyraźnie dozwolony / wspomniany w PEP 484 (również w celu zapewnienia zgodności z Pythonem 2.7)
Claude
1
Jest to również ważna opcja zgodnie z PEP 484
Marco
Ten formularz działa również z pętlami for / enumerate i PyCharm 2018. np.for index, area in enumerate(area_list): # type: int, AreaInfo
simpleuser
13

Działa to dobrze w moim w PyCharm (przy użyciu Pythona 3.6)

for i in range(5):
    i: int = i
    pass
Samir
źródło
Myślę, że powinna to być akceptowana odpowiedź, ponieważ robi dokładnie to, o co proszono i nie powoduje innych błędów i / lub ostrzeżeń, w przeciwieństwie do obecnie akceptowanej.
Jani Kärkkäinen
2
MyPy faktycznie narzeka, jeśli przedefiniujesz zmienną w pętli for
Giovanni Di Milia
3
Nie redefiniuj zmiennej. i: intwystarczy i nie będziesz mieć żadnych reklamacji.
user136036
-4

Żadna z odpowiedzi nie była przydatna, z wyjątkiem stwierdzenia, że ​​nie możesz. Nawet zaakceptowana odpowiedź używa składni z dokumentu PEP 526, która nie jest poprawną składnią Pythona. Jeśli spróbujesz wpisać

x: int

Zobaczysz, że to błąd składni.

Oto przydatne obejście:

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

Wykonuj swoją pracę z x. PyCharm rozpoznaje jego typ i działa autouzupełnianie.

Edward Ned Harvey
źródło
10
Jest to poprawna składnia, przynajmniej dla Pythona 3.6. Zobacz PEP 526
grepcake