大型项目似乎不可避免地需要
一些
# 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)
我们得到一个错误信息,告诉我们可以删除那个忽略的注释。 很好!
愿你的无知永远减少。
-阿丹