如何在for循环中注释类型?

267

我想在 for 循环中为变量注释类型。我尝试了这个方法,但它没有起作用:

for i: int in range(5):
    pass

我期望在 PyCharm 2016.3.2 中使用自动完成功能,但是使用预注释并没有起作用:

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

附注:预注释适用于PyCharm版本号>=2017.1。


1
只是一句话:通常情况下,您不需要它,因为类型是从范围函数中推断出来的(这适用于所有内部声明的变量)。 - gdoumenc
5个回答

388
根据PEP 526,以下操作是不允许的:

此外,不能对在forwith语句中使用的变量进行注释;可以事先以类似于元组解包的方式进行注释。

在循环之前进行注释:
i: int
for i in range(5):
    pass

PyCharm 2018.1及以上版本现在可以识别循环内变量的类型。这在旧版PyCharm中不被支持。


4
但会有一个检查信息:'i'本地变量的值未被使用。 - Cloud
5
@SiminJie 是的,因为这只是一个例子。 - alecxe
2
这对于在多个对象上进行解包的for循环也非常有效,例如:key: str df: pd.DataFrame for key, df in myData.items(): ... - topher217
@Cloud 你是什么意思?我的代码运行良好,没有任何问题...? - Charlie Parker
太棒了。这非常有帮助,如果你像这样做,VSCode能够识别提示。 - John Henckel
@JohnHenckel 但不幸的是,不能使用微软自己的PyLance。:( - undefined

91

我不知道这个解决方案是否符合PEP标准,或者这只是PyCharm的一个特性,但我是这样让它工作的:

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

我正在使用 Pycharm 社区版 2016.2.1


1
虽然不符合PEP 526标准,但这在PyCharm中可以工作(至少在2017.2.1版本中),并且还具有在Python 3.0-3.5中工作的附加好处(该版本不支持在Python 3.6中引入的预注释语法)。 - phoenix
15
FYI:此格式在 PEP 484 中明确允许/提及(也与 Python 2.7 兼容)。 - Claude
5
根据 PEP 484,这也是一个有效的选项。 - Marco
5
这个表格也适用于for/enumerate循环和PyCharm 2018。例如:for index, area in enumerate(area_list): # type: int, AreaInfo - simpleuser
我本以为Python再怪异也不会再奇怪了 :) 乍一看,我觉得答案完全无关哈哈。如果你走在同样的道路上,别担心,它实际上是有效的。 - eddym

27

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

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

我认为这应该是被接受的答案,因为它恰好做到了所要求的,并且不会出现其他错误和/或警告,与当前被接受的答案相比。 - Jani Kärkkäinen
6
如果你在for循环中重新定义变量,MyPy实际上会发出警告。 - Giovanni Di Milia
27
不要重新定义变量。i: int已经足够了,你不会收到任何投诉。 - user136036
对我来说,一种优雅的选择是在注释中指定类型。 - Vlad Iliescu
你也可以将它放在循环之前。我觉得这样看起来更好。不知道它是否会影响运行时间,但可能已经进行了优化处理。 - ch4rl1e97

3

虽然我更喜欢在可能的情况下使用类型提示,但是使用assert isinstance(...)也可以作为一种替代解决方案/变通方法来实现相同的好处(即:在IDE中正确的语法高亮和自动完成)。 我不知道这是否适用于PyCharm,但它确实适用于Visual Studio Code。

for x, y, z in range(5):
    assert isinstance(i, int)
    # Now VS Code knows the type of `i`, so syntax highlighting
    # and auto-completion do work as intended :-)

显然,添加assert对代码有影响,这可能是好事或坏事,具体取决于您的用例。 它绝对不同于类型提示,但作为副作用,它似乎具有相同的好处。


-7

这里的回答都没有用,除了说你不能这样做。即使是被接受的答案也使用了PEP 526文档中的语法,这不是有效的Python语法。如果你尝试输入

x: int

你会发现这是一个语法错误。
这里有一个有用的解决方法:
for __x in range(5):
    x = __x  # type: int
    print(x)

使用x完成您的工作。PyCharm会识别其类型,并自动完成。


13
这是有效的 Python 3.6 语法,至少可以参考PEP 526 - grepcake
8
没错,但这是没有爱的编码 ;) - Leo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接