·  阅读 Python类型提示 - 如何用Mypy管理 "type: ignore "注释

大型项目似乎不可避免地需要 一些 # type: ignore ,以便在棘手的情况下绕过类型检查。我发现Mypy有几个选择标志,使这种 忽略评论 更加精确和易于管理。

这些标志是。

  • show_error_codes ,告诉Mypy用代码识别错误信息,然后我们可以在忽略注释中使用这些代码。
  • warn_unused_ignores , 它告诉Mypy记录不必要的忽略注释的错误。
  • 我们可以像这样在 setup.cfg ,为整个项目激活这些标志。

    [mypy]
    show_error_codes = True
    warn_unused_ignores = True
    

    让我们更详细地看一下每个标志。

    show_error_codes

    这第一个标志可以帮助我们编写有针对性的忽略注释,只禁用我们想忽略的检查。 当 show_error_codes我们可以在忽略注释中使用这些代码,减少在这些行中引入其他错误的风险。

    以这段代码为例。

    x: int
    x: str
    

    当我们像这样重新定义一个变量的类型时,Mypy会记录一个错误。 这通常是一个改变我们代码的理由,但在这个例子中,我们还是用它吧。

    让我们在这个例子上运行Mypy,用show_error_codes = True

    $ mypy example.py
    example.py:2: error: Name 'x' already defined on line 1  [no-redef]
    Found 1 error in 1 file (checked 1 source file)
    

    错误信息后面是方括号中的错误代码:[no-redef] 。我们可以在忽略注释中使用这个方括号中的错误代码,让那个错误沉默。

    x: int
    x: str  # type: ignore [no-redef]
    

    现在运行Mypy没有显示错误。

    $ mypy --show-error-codes example.py
    Success: no issues found in 1 source file
    

    我们可以在忽略行中引入一个不同的错误,Mypy仍然会发现它。 例如,我们可以添加一个对未定义变量的引用y

    x: int
    x: str = y  # type: ignore [no-redef]
    

    Mypy会发现这个错误。

    $ mypy example.py
    example.py:2: error: Name 'y' is not defined  [name-defined]
    Found 1 error in 1 file (checked 1 source file)
    

    如果该行使用一般的忽略注释,没有括号中的错误代码,这个错误就会被忽略。

    如果我们有需要,我们可以通过在逗号分隔的列表中组合它们的代码来忽略两个错误。

    x: int
    x: str = y  # type: ignore [name-defined,no-redef]
    

    但这也可能是一个信号,让我们把这一行拆开,或者修复错误的原因!这也是一个信号。

    warn_unused_ignores

    第二个标志帮助我们在代码改变时管理忽略注释。 warn_unused_ignores启用后,Mypy会对每个不必要的忽略注释记录一个错误*(而不是*警告)。 这种冗余会随着我们代码的发展而出现,比如当我们的类型提示变得更加精确时。

    例如,想象一下,如果我们改变我们之前的例子,删除第一行。

    x: str  # type: ignore [no-redef]
    

    现在x 只定义了一次。用warn_unused_ignores = True 运行Mypy 。

    $ mypy --warn-unused-ignores example.py
    example.py:1: error: unused 'type: ignore' comment
    Found 1 error in 1 file (checked 1 source file)
    

    我们得到一个错误信息,告诉我们可以删除那个忽略的注释。 很好!

    愿你的无知永远减少。

    -阿丹

    分类:
    人工智能
  •