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

问题描述 投票:0回答:6

我想在

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

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
6个回答
392
投票

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

此外,不能注释在

for
with
中使用的变量 声明
;它们可以提前注释,方式类似于 元组拆包

在循环之前注释它:

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

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


91
投票

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

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

我使用的是 Pycharm Community Edition 2016.2.1


27
投票

这对我的 PyCharm 很有效(使用 Python 3.6)

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

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
会对代码产生影响,这可能是好事也可能是坏事,具体取决于您的用例。 它绝对与类型提示不同,但作为副作用,它似乎具有相同的好处。


0
投票

另一种技术,无论您的对象在 for 循环声明中是动态的还是在外部作用域中找到,都更加一致,是使用注释外部类型而不是内部类型:

您的原始版本:

for i: int in range(5):
    pass

建议版本(例如 1):

range_list:list[int] = range(5)
for i in range_list:
    pass

建议版本(例如 2):

def my_func(range_list:list[int]):
    for i in range_list:
        pass

至少在 VSCode 中,这似乎可以正确地将

i
的类型检测为
int
,查看
list[int]
注释。


-7
投票

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

x: int

您会发现这是一个语法错误。

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

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

x
一起工作。 PyCharm 可以识别它的类型,并且自动完成功能可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.