在我工作的公司,我们使用类型注解来定义函数的预期返回类型。大多数开发人员都在使用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请求接受。既然我能接受这个警告,我想压制它。
3条答案
按热度按时间3j86kqsm1#
Pylance支持PEP 484
函数注解存在许多现有或潜在的用例,它们与类型提示不兼容。这些可能会混淆静态类型检查器。然而,由于类型提示注解没有运行时行为(除了注解表达式的求值和将注解存储在函数对象的_annotations_属性中),这不会使程序不正确-它只是可能导致类型检查器发出虚假的警告或错误。
要标记程序中不应被类型提示覆盖的部分,可以使用以下一种或多种方法:
a # type:忽略注解;
类或函数上的@no_type_check装饰器;
自定义类或函数装饰器,标记为@no_type_check_decorator。
或者,您可以为Pyright创建一个
pyrightconfig.json
(这就是Pylance
在下面使用的)或在项目的根目录中创建一个pyproject.toml
,并指定要忽略的错误类型。您可以在出现错误消息的悬停小部件中看到错误类型。pyrightconfig.json
示例:pyproject.toml
示例:有关详细信息,请参见类型检查诊断设置。
xxls0lw82#
一个不总是涵盖的附加选项是具有特定规则名称的内联忽略。当在严格的代码库中工作时,这是非常好的,该代码库不允许没有指定规则的泛型mypy样式
# type: ignore
。下面是一个常见的例子,当类型收缩不起作用时:
# pyright: reportUnknownMemberType=false
它比典型的
# type: ignore[assignment]
稍微复杂一些,但可以很好地抑制大多数Pylance错误。此外,如果您想手动查找特定的规则名称(例如当Pylance无法正确显示它们时),给予以下列表:pyright/.../diagnosticRules.ts
z9gpfhce3#
top-voted answer是伟大的,但我可以看到为什么它还没有被接受。我的回答也没有解决问题,但我认为这是有帮助的。
另一种选择是修改您的
.vscode/settings.json
(工作区设置或用户设置),如here和here所述,如下所示。(注意使用了"none"
而不是false
)(如果您已经有工作区设置,并且不想添加其他设置文件,如投票最高的答案所示(如
pyrightconfig.json
或pyproject.toml
),则这可能是更好的选择)我认为OP的评论是正确的,这个错误不是
reportGeneralTypeIssues
类型的问题。两种方法我都试过了,但错误仍然存在。也许这不是一个reportGeneralTypeIssues?
如果重置Pylance设置(将所有诊断代码标记为错误(删除settings.json,或使用“错误”诊断设置)),并在下面键入OP代码
VSCode/Pylance/Pyright显示一个错误,当你悬停时,它会列出 * 两个 * 错误原因。
Pylance
”(无诊断代码)Pylance(reportGeneralTypeIssues)
,(注意是诊断代码)如果您按照上述方法修改settings.json:
...则第二个
Pylance(reportGeneralTypeIssues)
类型错误消失,但原始Pylance
错误(无诊断代码)仍然存在:得票最多的回答者建议尝试其他诊断代码,但似乎此错误比任何诊断代码描述的都更像是“核心错误”?
我认为这很容易责怪编辑器(VSCode),但我不认为这是VSCode的错,VSCode只是使用了Pylance,Pylance只是试图实现Python标准/PEP,对吗?
我仍然不明白
[str]
是如何有效/标准的类型提示语法,正如这位评论者所说。我同意OP,
[str]
是“更短,做的伎俩”,但它不是标准的,是吗?未在任何PEP中定义?不是在PEP 484,也不是在PEP 585。这是不是意味着PyCharm支持了一些非标准的东西?