Mypy + flake8:有什么办法可以抑制“F821 未定义名称”的警告

nom*_*ddo 4 python-3.x flake8 mypy

在下面的代码中, flake8 说F821 undefined name 'B'. 但是对于 mypy,需要输入提示f。flake8 如何忽略此类警告?

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


class B():
    pass
Run Code Online (Sandbox Code Playgroud)

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

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

Ant*_*ile 9

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

$ 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
Run Code Online (Sandbox Code Playgroud)

您有两种选择来解决这个问题,一种是显式使用前向声明(通过将类型名括在引号中):

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


class B():
    pass
Run Code Online (Sandbox Code Playgroud)

运行:

$ python3.8 t.py
$ flake8 t.py
Run Code Online (Sandbox Code Playgroud)

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

from __future__ import annotations


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


class B():
    pass
Run Code Online (Sandbox Code Playgroud)

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


小智 4

您可以使用它# noqa:来消除某些错误。例子:

测试.py

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


class B():
    pass
Run Code Online (Sandbox Code Playgroud)

巴什

$ flake8 test.py
(return no error)
Run Code Online (Sandbox Code Playgroud)

另请参阅:http://flake8.pycqa.org/en/3.1.1/user/ignoring-errors.html#in-line-ignoring-errors