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

问题描述 投票:0回答:2

在下面的代码中,flake8说F821 undefined name 'B'。但对于mypy,f的类型提示是必要的。如何忽略flake8的这种警告?

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


class B():
    pass

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

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

python-3.x mypy flake8
2个回答
0
投票

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

test.朋友

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


class B():
    pass

庆典

$ flake8 test.py
(return no error)

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


1
投票

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

$ 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

你有两个选项来解决这个问题,一个是明确使用前向声明(通过在引号中包装typename):

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,它还改进了正向注释和类型注释的处理

© www.soinside.com 2019 - 2024. All rights reserved.