Mypy+flake8:有什么方法可以取消"F821未定义名称"的警告吗



在下面的代码中,flake8表示F821 undefined name 'B'。但是对于mypy来说,为f键入hint是必要的。如何忽视flake8的此类警告?

def f(b: B) -> None:
pass

class B():
pass

这个例子可以简单地解决:更改声明的顺序。但在现实情况下,有时我无法更改订单。这种误导性的警告对我来说太吵了

我的环境:Python 3.6+flake8 3.6.0+mypy 0.641+flake8mypy 17.8.0

这不是一个误导性的警告,不应被忽略,运行您的代码将导致当前的崩溃:

$ python3.8 t.py
Traceback (most recent call last):
File "t.py", line 1, in <module>
def f(b: B) -> None:
NameError: name 'B' is not defined

有两个选项可以解决这个问题,一个是显式使用正向声明(通过用引号括住类型名(:

def f(b: 'B') -> None:
pass

class B():
pass

运行时:

$ python3.8 t.py
$ flake8 t.py

或者使用from __future__ import annotations(python3.7中的新功能(:

from __future__ import annotations

def f(b: B) -> None:
pass

class B():
pass

注意:我使用的是flake8 3.7.x,它还改进了对前向注释和类型注释的处理

您可以使用# noqa:来消除一些错误。示例:

测试.py

def f(b: B) -> None:  # noqa: F821
pass

class B():
pass

bash

$ flake8 test.py
(return no error)

另请参阅:http://flake8.pycqa.org/en/3.1.1/user/ignoring-errors.html#in-线路忽略错误

最新更新