ChatGPT解决这个技术问题 Extra ChatGPT

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

我想在 for 循环中注释变量的类型。我试过了,但没有用:

for i: int in range(5):
    pass

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

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

PS 预注释适用于 PyCharm >= 2017.1。

只是一个评论:通常你不应该需要它,因为类型是从范围函数推导出来的(这与所有内部声明的变量有关)

a
alecxe

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

此外,不能注释在 for 或 with 语句中使用的变量;它们可以提前注释,类似于元组拆包

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

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

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


但是会有一个检查信息Local variable 'i' value is not used
@SiminJie 是的,因为这只是一个例子。
这也适用于解压两个多个对象的 for 循环:例如 key: str df: pd.DataFrame for key, df in myData.items(): ...
A
Alex Waygood

我不知道这个解决方案是 PEP 兼容的还是只是 PyCharm 的一个功能,但我让它像这样工作:

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

我正在使用 Pycharm 社区版 2016.2.1


虽然不符合 PEP 526,但它确实在 PyCharm 中工作(至少截至 2017.2.1),并且还具有在 Python 3.0-3.5 中工作的额外好处(不支持 Python 3.6 中引入的预注释语法)。
仅供参考:PEP 484 中明确允许/提及此格式(也与 python 2.7 兼容)
根据 PEP 484,这也是一个有效选项
这种形式也适用于 for/enumerate 循环和 PyCharm 2018。例如 for index, area in enumerate(area_list): # type: int, AreaInfo
S
Samir

这适用于我在 PyCharm 中(使用 Python 3.6)

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

我认为这应该是公认的答案,因为这完全符合要求,并且不会发出其他错误和/或警告,而不是当前接受的答案。
如果您在 for 循环中重新定义变量,MyPy 实际上会抱怨
不要重新定义变量。 i: int 就足够了,您不会收到任何投诉。
一个优雅的选择,对我来说,在评论中指定类型看起来更好。
E
Edward Ned Harvey

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

x: int

你会看到这是一个语法错误。

这是一个有用的解决方法:

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

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


至少对于 python 3.6,它是有效的语法。请参阅PEP 526
不完全错误,但这是没有爱的编码;)