我想在
for
循环中注释变量的类型。我试过了,但没用:
for i: int in range(5):
pass
我期望在 PyCharm 2016.3.2 中自动完成工作,但使用 预注释不起作用:
i: int
for i in range(5):
pass
附注预注释适用于 PyCharm >= 2017.1。
根据PEP 526,这是不允许的:
此外,不能注释在
或for
中使用的变量 声明;它们可以提前注释,方式类似于 元组拆包with
在循环之前注释它:
i: int
for i in range(5):
pass
PyCharm 2018.1 及更高版本现在可以识别循环内变量的类型。旧版 PyCharm 不支持此功能。
我不知道这个解决方案是否与 PEP 兼容,或者只是 PyCharm 的一个功能,但我让它像这样工作:
for i in range(5): #type: int
pass
我使用的是 Pycharm Community Edition 2016.2.1
这对我的 PyCharm 很有效(使用 Python 3.6)
for i in range(5):
i: int = i
pass
虽然我更喜欢在可能的情况下使用类型提示,但使用
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
会对代码产生影响,这可能是好事也可能是坏事,具体取决于您的用例。
它绝对与类型提示不同,但作为副作用,它似乎具有相同的好处。
另一种技术,无论您的对象在 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]
注释。
除了说你不能之外,这里的所有回复都没有用。即使接受的答案也使用 PEP 526 文档中的语法,这不是有效的 python 语法。如果您尝试输入
x: int
您会发现这是一个语法错误。
这是一个有用的解决方法:
for __x in range(5):
x = __x # type: int
print(x)
与
x
一起工作。 PyCharm 可以识别它的类型,并且自动完成功能可以工作。