Joe*_*oep 17 python visual-studio-code pylance
在我工作的公司,我们使用类型注释来定义函数的预期返回类型。大多数开发人员都使用 PyCharm,但我更喜欢坚持使用 VS Code。
VS Code IDE 中的以下行:
def example() -> [str]:
Run Code Online (Sandbox Code Playgroud)
发出 Pylance 警告:
List expression not allowed in type annotation
Use List[T] to indicate a list type or Union[T1, T2] to indicate a union typePylance
Run Code Online (Sandbox Code Playgroud)
并希望我使用:
def example() -> List[str]
Run Code Online (Sandbox Code Playgroud)
尽管修复此问题需要我检查整个代码库,并且不会接受拉取请求。由于我可以忍受这个警告,所以我想抑制它。
Ale*_*ptu 11
皮兰斯支持PEP 484
函数注释存在许多现有或潜在的用例,它们与类型提示不兼容。这些可能会使静态类型检查器感到困惑。然而,由于类型提示注释没有运行时行为(除了注释表达式的求值和将注释存储在函数对象的_annotations_属性中),这不会使程序不正确 - 它只是可能导致类型检查器发出虚假的警告或错误。
要标记程序中不应被类型提示覆盖的部分,您可以使用以下一项或多项:
a # 类型:忽略注释;
类或函数上的 @no_type_check 装饰器;
用@no_type_check_decorator标记的自定义类或函数装饰器。
或者,您可以创建一个pyrightconfig.jsonfor Pyright(因为这就是Pylance下面使用的)或一个pyproject.tomlin 项目的根目录,并指定要忽略的错误类型。您可以在出现错误消息的悬停小部件中查看错误类型。
pyrightconfig.json例子:
{
"reportGeneralTypeIssues": false,
}
Run Code Online (Sandbox Code Playgroud)
pyproject.toml例子:
[tool.pyright]
reportGeneralTypeIssues = false
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅类型检查诊断设置。
得票最高的答案很好,但它可能无法解决问题(它只是忽略类型检查器,对吧?)。我的回答也没有解决问题,但我认为它是有帮助的。
我建议您按照此处和此处所述以及如下所示修改您的.vscode/settings.json(工作区设置或用户设置) 。(注意使用代替)"none"false
(如果您已经有工作区设置并且您不想添加其他设置文件,如投票最高的答案中所示(例如pyrightconfig.json或pyproject.toml),那么这可能是更好的选择)
{
"python.analysis.typeCheckingMode": "basic",
"python.analysis.diagnosticSeverityOverrides": {
"reportGeneralTypeIssues": "none"
}
}
Run Code Online (Sandbox Code Playgroud)
我认为OP的这个评论是正确的,这个错误不是reportGeneralTypeIssues类型问题。
我已经尝试了两种解决方案,但错误仍然存在。也许这不是报告GeneralTypeIssues?
如果您重置 Pylance 设置(将所有诊断代码标记为错误(删除 settings.json,或使用“错误”诊断设置)),并且您在下面键入 OP 代码
def example() -> [str]:
return ["hi"]
Run Code Online (Sandbox Code Playgroud)
VSCode/Pylance/Pyright 以波浪线显示错误,当您将鼠标悬停时,它会列出两个错误原因。
Pylance” (无诊断代码)Pylance(reportGeneralTypeIssues),(注意有一个诊断代码)如果您按照上述方式修改 settings.json:
...
"python.analysis.diagnosticSeverityOverrides": {
"reportGeneralTypeIssues": "none"
}
...
Run Code Online (Sandbox Code Playgroud)
...然后第二种Pylance(reportGeneralTypeIssues)类型的错误消失,但原始Pylance错误(没有诊断代码)仍然存在:
投票最高的回答者建议尝试其他诊断代码,但似乎这个错误比任何诊断代码描述的都更像是“核心错误”?
我认为责怪编辑器(VSCode)很容易,但我不认为这是 VSCode 的错,VSCode 只是使用 Pylance,而 Pylance 只是试图实现Python 标准/PEP,对吗?
我仍然不明白[str]有效/标准类型提示语法如何,正如这位评论者所说。
我同意OP的观点,[str]是“更短并且有效”,但这不是标准的,不是吗?没有在任何 PEP 中定义?PEP 484中没有,PEP 585中没有。这是否意味着PyCharm支持一些非标准的东西?
不总是涵盖的另一选项是具有特定规则名称的内联忽略。# type: ignore当在严格的代码库中工作时,这非常有用,该代码库不允许在未指定规则的情况下使用通用 mypy 样式。
这是一个常见的例子,当类型缩小不起作用时:
# pyright: ignore[reportUnknownMemberType]
它比典型的 复杂一些# type: ignore[assignment],但可以很好地抑制大多数 Pylance 错误。请注意,它使用数组,因此您也可以添加更多规则来忽略内联。
# pyright: ignore[reportUnknownMemberType, reportGeneralTypeIssues]
此外,如果您想手动查找特定规则名称(例如当 Pylance 无法正确显示它们时),请尝试此列表:pyright/.../diagnosticRules.ts