错误代码(Error codes)

Mypy 可以选择在每条错误消息后显示一个错误代码,例如 [attr-defined]。错误代码有两个目的:

  1. 可以使用 # type: ignore[code] 在某一行静默特定的错误代码。这样你就不会意外忽略其他潜在更严重的错误。

  2. 错误代码可用于查找有关错误的文档。接下来的两个主题(默认启用的错误代码(Error codes enabled by default)可选检查的错误代码(Error codes for optional checks))记录了 mypy 可以报告的各种错误代码。

大多数错误代码在多个相关的错误消息之间共享。错误代码可能会在未来的 mypy 版本中更改。

基于错误代码静默错误(Silencing errors based on error codes)

你可以使用特殊的注释 # type: ignore[code, ...] 仅在特定行上忽略具有特定错误代码(或代码)的错误。这即使在你没有配置 mypy 显示错误代码的情况下也可以使用。

这个示例展示了如何忽略一个关于导入名称的错误,mypy 认为该名称未定义:

# 'foo' 在 'foolib' 中定义,即使 mypy 无法看到该定义。
from foolib import foo  # type: ignore[attr-defined]

全局启用/禁用特定错误代码(Enabling/disabling specific error codes globally)

有命令行标志和配置文件设置,用于启用某些可选错误代码,例如 --disallow-untyped-defs,这将启用 no-untyped-def 错误代码。

你可以使用 --enable-error-code--disable-error-code 来启用或禁用没有专用命令行标志或配置文件设置的特定错误代码。

每个模块启用/禁用错误代码(Per-module enabling/disabling error codes)

你可以使用 配置文件 部分,仅在某些模块中启用或禁用特定错误代码。例如,这个 mypy.ini 配置将允许在测试中使用非注解的空容器,同时保持其他部分代码在严格模式下检查:

[mypy]
strict = True

[mypy-tests.*]
allow_untyped_defs = True
allow_untyped_calls = True
disable_error_code = var-annotated, has-type

请注意,每模块的启用/禁用将覆盖全局选项。因此,如果在全局配置部分中有错误代码列表,则无需为每个模块重复这些列表。例如:

[mypy]
enable_error_code = truthy-bool, ignore-without-code, unused-awaitable

[mypy-extensions.*]
disable_error_code = unused-awaitable

上述配置将允许扩展模块中的未使用的 awaitable,但仍会保持其他两个错误代码启用。整体逻辑如下:

  • 命令行和/或配置主部分设置全局错误代码

  • 各个配置部分按 glob/module 调整 它们

  • 行内 # mypy: disable-error-code="..."# mypy: enable-error-code="..." 注释可以进一步 调整 它们以适应特定文件。例如:

# mypy: enable-error-code="truthy-bool, ignore-without-code"

因此,可以全局启用某些代码,在相应的配置部分中禁用所有测试中的代码,然后在某些特定测试中用行内注释重新启用它。

错误代码的子代码(Subcodes of error codes)

在某些情况下,主要出于向后兼容性原因,一个错误代码可能也被另一个更广泛的错误代码覆盖。例如,代码为 [method-assign] 的错误可以通过 # type: ignore[assignment] 被忽略。类似的逻辑也适用于全局禁用错误代码。如果给定的错误代码是另一个错误代码的子代码,它将在文档中提及更狭窄的代码。这个层级不是嵌套的:不能有其他子代码的子代码。

强制要求错误代码(Requiring error codes)

可以强制要求在 type: ignore 注释中指定错误代码。有关更多信息,请参见 ignore-without-code