python 在VS代码中抑制Pylance类型注解警告

m1m5dgzv  于 2023-05-27  发布在  Python
关注(0)|答案(3)|浏览(339)

在我工作的公司,我们使用类型注解来定义函数的预期返回类型。大多数开发人员都在使用PyCharm,但我更喜欢使用VS Code。
VS Code IDE中的以下行:

def example() -> [str]:

引发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

并希望我用途:

def example() -> List[str]

尽管修复这个问题需要我检查整个代码库,并且不会被pull请求接受。既然我能接受这个警告,我想压制它。

3j86kqsm

3j86kqsm1#

Pylance支持PEP 484
函数注解存在许多现有或潜在的用例,它们与类型提示不兼容。这些可能会混淆静态类型检查器。然而,由于类型提示注解没有运行时行为(除了注解表达式的求值和将注解存储在函数对象的_annotations_属性中),这不会使程序不正确-它只是可能导致类型检查器发出虚假的警告或错误。
要标记程序中不应被类型提示覆盖的部分,可以使用以下一种或多种方法:
a # type:忽略注解;
类或函数上的@no_type_check装饰器;
自定义类或函数装饰器,标记为@no_type_check_decorator。
或者,您可以为Pyright创建一个pyrightconfig.json(这就是Pylance在下面使用的)或在项目的根目录中创建一个pyproject.toml,并指定要忽略的错误类型。您可以在出现错误消息的悬停小部件中看到错误类型。
pyrightconfig.json示例:

{
        "reportGeneralTypeIssues": false,
}

pyproject.toml示例:

[tool.pyright]
reportGeneralTypeIssues = false

有关详细信息,请参见类型检查诊断设置。

xxls0lw8

xxls0lw82#

一个不总是涵盖的附加选项是具有特定规则名称的内联忽略。当在严格的代码库中工作时,这是非常好的,该代码库不允许没有指定规则的泛型mypy样式# type: ignore
下面是一个常见的例子,当类型收缩不起作用时:
# pyright: reportUnknownMemberType=false
它比典型的# type: ignore[assignment]稍微复杂一些,但可以很好地抑制大多数Pylance错误。
此外,如果您想手动查找特定的规则名称(例如当Pylance无法正确显示它们时),给予以下列表:pyright/.../diagnosticRules.ts

z9gpfhce

z9gpfhce3#

top-voted answer是伟大的,但我可以看到为什么它还没有被接受。我的回答也没有解决问题,但我认为这是有帮助的。
另一种选择是修改您的.vscode/settings.json(工作区设置或用户设置),如herehere所述,如下所示。(注意使用了"none"而不是false

{
  "python.analysis.typeCheckingMode": "basic",
  "python.analysis.diagnosticSeverityOverrides": {
    "reportGeneralTypeIssues": "none"
  }
}

(如果您已经有工作区设置,并且不想添加其他设置文件,如投票最高的答案所示(如pyrightconfig.jsonpyproject.toml),则这可能是更好的选择)
我认为OP的评论是正确的,这个错误不是reportGeneralTypeIssues类型的问题。
两种方法我都试过了,但错误仍然存在。也许这不是一个reportGeneralTypeIssues?
如果重置Pylance设置(将所有诊断代码标记为错误(删除settings.json,或使用“错误”诊断设置)),并在下面键入OP代码

def example() -> [str]:
    return ["hi"]

VSCode/Pylance/Pyright显示一个错误,当你悬停时,它会列出 * 两个 * 错误原因。

  • 第一个错误显示“类型注解中不允许使用列表[T]...”,并且仅标记为“Pylance(无诊断代码)
  • 第二个错误显示“预期的类型表达式,但收到了“list[Type[str]]”,并且标记为Pylance(reportGeneralTypeIssues),(注意诊断代码)

如果您按照上述方法修改settings.json:

...

  "python.analysis.diagnosticSeverityOverrides": {
    "reportGeneralTypeIssues": "none"
  }
...

...则第二个Pylance(reportGeneralTypeIssues)类型错误消失,但原始Pylance错误(无诊断代码)仍然存在

得票最多的回答者建议尝试其他诊断代码,但似乎此错误比任何诊断代码描述的都更像是“核心错误”?
我认为这很容易责怪编辑器(VSCode),但我不认为这是VSCode的错,VSCode只是使用了Pylance,Pylance只是试图实现Python标准/PEP,对吗?
我仍然不明白[str]是如何有效/标准的类型提示语法,正如这位评论者所说。
我同意OP,[str]是“更短,做的伎俩”,但它不是标准的,是吗?未在任何PEP中定义?不是在PEP 484,也不是在PEP 585。这是不是意味着PyCharm支持了一些非标准的东西?

相关问题