如何在 for 循环中注释类型?
Posted
技术标签:
【中文标题】如何在 for 循环中注释类型?【英文标题】:How do I annotate types in a for-loop? 【发布时间】:2017-05-29 05:29:58 【问题描述】:我想在for
-loop 中注释一个变量的类型。我试过了,但没有用:
for i: int in range(5):
pass
我期望在 PyCharm 2016.3.2 中使用自动完成功能,但使用 预注释不起作用:
i: int
for i in range(5):
pass
附:预注释适用于 PyCharm >= 2017.1。
【问题讨论】:
只是备注:通常你不需要它,因为类型是从范围函数推导出来的(这与所有内部声明的变量有关) 【参考方案1】:根据PEP 526,这是不允许的:
此外,一个无法注释
for
或with
中使用的变量 声明;它们可以提前注释,以类似的方式 元组解包
在循环之前注释它:
i: int
for i in range(5):
pass
PyCharm 2018.1 及更高版本 现在可以识别循环内变量的类型。这在旧版 PyCharm 中不受支持。
【讨论】:
但是会有一个inspect infoLocal variable 'i' value is not used
。
@SiminJie 是的,因为这只是一个例子。
这也适用于解压两个多个对象的 for 循环:例如key: str df: pd.DataFrame for key, df in myData.items(): ...
【参考方案2】:
我不知道这个解决方案是 PEP 兼容还是只是 PyCharm 的一个功能,但我让它像这样工作:
for i in range(5): #type: int
pass
我正在使用 Pycharm Community Edition 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
【参考方案3】:
这适用于我在 PyCharm 中(使用 Python 3.6)
for i in range(5):
i: int = i
pass
【讨论】:
我认为这应该是公认的答案,因为这完全符合要求并且不会发出其他错误和/或警告,而不是当前接受的。 如果您在 for 循环中重新定义变量,MyPy 实际上会抱怨 不要重新定义变量。i: int
就够了,你不会有任何抱怨。【参考方案4】:
这里的回答都没有用,只是说你不能。即使是接受的答案也使用 PEP 526 文档中的语法,这不是有效的 python 语法。如果您尝试输入
x: int
你会发现这是一个语法错误。
这是一个有用的解决方法:
for __x in range(5):
x = __x # type: int
print(x)
使用x
完成您的工作。 PyCharm 识别它的类型,并且自动完成工作。
【讨论】:
这是有效的语法,至少对于 python 3.6。见PEP 526 不完全错误,但这是没有爱的编码;)以上是关于如何在 for 循环中注释类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何在此 for 循环中修复'无法将'String'类型的值转换为预期的参数类型'Int'
Swift编程语言中如何实现自定义类型的for-in循环(基于Swift 2.2)