Як анотувати типи у циклі for


93

Я хочу анотувати тип змінної у- forциклу. Я спробував це:

for i: int in range(5):
    pass

Але це не спрацювало, очевидно.

Я очікую, що працює автозаповнення в PyCharm 2016.3.2. Попередня анотація така:

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

не допомагає.

PS Попередня анотація працює для PyCharm> = 2017.1


Просто зауваження: Зазвичай це вам не потрібно, оскільки тип виводиться із функції діапазону (це актуально для всіх внутрішніх оголошених змінних)
gdoumenc

Відповіді:


124

Відповідно до PEP 526 це заборонено:

Крім того, не можна коментувати змінні, що використовуються в операторі forабо withоператорі ; їх можна анотувати заздалегідь, подібно до розпакування кортежів

Анотуйте його перед циклом:

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

PyCharm 2018.1 та новіші версії тепер розпізнають тип змінної всередині циклу. Це не підтримувалось у старих версіях PyCharm.


1
Я спробував, але, здається, це не працює в останній стабільній PyCharm. Я не отримую жодного автозавершення принаймні.
grepcake

2
Я використовую PyCharm 2018.1, і тепер він розпізнає цю форму.
філолог

2
@philologon приємно! Дякуємо за увагу, оновили відповідь відповідно.
alecxe

3
Але буде інформація про перевірку Local variable 'i' value is not used.
Simin Jie

1
iУ i: intще не буде використовуватися , навіть використовувати iв циклі. Я думаю, що це недолік такого роду анотацій.
Simin Jie

38

Я не знаю, чи сумісне це рішення з PEP, чи лише функція PyCharm, але я змусив його працювати так

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

і я використовую Pycharm Community Edition 2016.2.1


2
Дякую, але я дотримуватимусь варіанту PEP 526
grepcake

Хоча це не сумісно з PEP 526, це працює в PyCharm (принаймні станом на 2017.2.1) і має додаткову перевагу також робота в Python 3.0-3.5 (який не підтримує синтаксис попередньої анотації, введений в Python 3.6).
Фенікс

4
FYI: Цей формат явно дозволений / згаданий у PEP 484 (також має бути сумісним з python 2.7)
Клод

1
Це також дійсний варіант згідно з PEP 484
Марко

Ця форма також працює з для / Перерахуємо петель і PyCharm 2018. наприкладfor index, area in enumerate(area_list): # type: int, AreaInfo
simpleuser

13

Це добре працює для мого в PyCharm (за допомогою Python 3.6)

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

Я вважаю, що це має бути прийнятою відповіддю, оскільки це робить саме те, про що просили, і не видає інших помилок та / або попереджень, на відміну від прийнятої нині.
Jani Kärkkäinen

2
MyPy насправді скаржиться, якщо ви перевизначите змінну у циклі for
Джованні Ді Мілія

3
Не перевизначайте змінну. i: intдостатньо, і ви не отримаєте жодних скарг.
user136036

-4

Жодна з відповідей тут не була корисною, за винятком того, щоб сказати, що ви не можете. Навіть прийнята відповідь використовує синтаксис з документа PEP 526, який не є допустимим синтаксисом python. Якщо спробувати ввести

x: int

Ви побачите, що це синтаксична помилка.

Ось корисне рішення:

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

Робіть свою роботу з x. PyCharm розпізнає його тип і виконує автозавершення.


10
Це дійсний синтаксис, принаймні, для python 3.6. Див. PEP 526
grepcake
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.