【问题标题】:How do I annotate types in a for-loop?如何在 for 循环中注释类型?
【发布时间】: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。

【问题讨论】:

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

标签: python for-loop pycharm type-hinting python-typing


【解决方案1】:

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

此外,一个无法注释forwith 中使用的变量 声明;它们可以提前注释,以类似的方式 元组解包

在循环之前注释它:

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
  • 不完全错误,但这是没有爱的编码;)
猜你喜欢
  • 2013-06-15
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
相关资源
最近更新 更多