我在一些 Python 代码中看到了 VSCode/Pylance 的奇怪行为。考虑以下最小示例:
#!/usr/bin/env python3
from typing import Optional
def main():
x: Optional[list] = None
def f():
nonlocal x
x = [10]
f()
assert isinstance(x, list)
y: int = x[0] + 3
assert isinstance(y, int)
print(y)
main()
对 f() 的调用显然将外部设置x
为[10]
. 将鼠标悬停x
在第一条assert
语句(在函数调用之后)显示(variable) x: None
,没关系。但在assert
声明之后,将鼠标悬停在 x 上显示(variable) x: Never
。这会导致x
以下所有行的语法突出显示和自动完成都失败,因为 VSCode/Pylance 显然看到了一个“无类型”的变量。打字x.
甚至不显示对象的内置成员,如x.__class__
or x.__doc__
。分配x
给另一个类型的变量没有帮助。第一个断言导致 mypy 接受代码,而 PyLint 说Value 'x' is unsubscriptable
,因此其他工具之间似乎也存在一些分歧。这有点烦人,因为代码可以正常工作。
问题:这是 Pylance 中的错误吗?甚至是预期的行为?有什么方法可以强制 Pylance 看到正确的类型x
?
工具版本:
$ code --version
1.56.2
054a9295330880ed74ceaedda236253b4f39a335
x64
$ pylint --version
pylint 2.8.2
astroid 2.5.6
Python 3.8.5 (default, Jan 27 2021, 15:41:15)
[GCC 9.3.0]
$ mypy --version
mypy 0.800
VSCode Python:v2021.5.842923320
VSCode Pylance:v2021.5.3
谢谢你和最好的问候,
菲利普
编辑:在GitHub 上发布问题