如何在for循环中注释类型


99

我想在for-loop中注释变量的类型。我尝试了这个:

for i: int in range(5):
    pass

但这显然没有用。

我期望在PyCharm 2016.3.2中能够自动完成工作。像这样的预注释:

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

没有帮助。

适用于PyCharm> = 2017.1的PS预注释作品


只是说明一下:通常,您不需要它,因为类型是从范围函数推断出来的(这与所有内部声明的变量有关)
gdoumenc

Answers:


132

根据PEP 526,这是不允许的:

另外,不能注释forwith 语句中使用的变量。可以像元组拆包一样提前注释它们

在循环之前对其进行注释:

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

PyCharm 2018.1及更高版本现在可以识别循环内变量的类型。较早的PyCharm版本不支持此功能。


1
我尝试过,但是在最后一个稳定的PyCharm中似乎没有用。我至少没有任何自动补全功能。
grepcake

2
我正在使用PyCharm 2018.1,它现在可以识别这种形式。
philologon

2
@philologon不错!感谢您的注意,相应地更新了答案。
alecxe

3
但是会有检查信息Local variable 'i' value is not used
Simin Jie

1
ii: int仍然不会被你正在使用用于i在循环。我认为这是此类注释的缺陷。
Simin Jie

39

我不知道此解决方案是否与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中引入的预注释语法)中的额外好处。
凤凰城

5
仅供参考:PEP 484中明确允许/提及了这种格式(也与python 2.7兼容)
Claude

1
根据PEP 484
Marco

这种形式也适用于for / enumerate循环和for index, area in enumerate(area_list): # type: int, AreaInfo
PyCharm2018

13

这对我在PyCharm(使用Python 3.6)中的效果很好

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

我认为这应该是可以接受的答案,因为它完全符合要求,并且不会发出其他错误和/或警告,而不是当前接受的答案。
JaniKärkkäinen19年

2
如果您在for循环中重新定义变量,MyPy实际上会抱怨
Giovanni Di Milia19

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

1
并非完全错误,但这是在没有爱的情况下编码;)
Leo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.