Mypy + flake8:有什么办法可以抑制“F821 未定义名称”的警告
Mypy + flake8: Is there any way to surpress warning of `F821 undefined name`
在下面的代码中,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
您可以使用 # noqa:
消除一些错误。示例:
test.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-line-ignoring-errors
这不是误导性警告,不应忽略,运行您的代码当前会导致崩溃:
$ 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,它还改进了前向注释和类型注释的处理
在下面的代码中,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
您可以使用 # noqa:
消除一些错误。示例:
test.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-line-ignoring-errors
这不是误导性警告,不应忽略,运行您的代码当前会导致崩溃:
$ 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,它还改进了前向注释和类型注释的处理