Flake8 不识别内置异常
我设置了一个严格的提交前检查,使用的是flake8,所以在它满意之前我不能提交代码。这通常是件好事,但现在却引发了一些看似没问题的麻烦。
我无法让Flake8识别一个叫做FileNotFoundError
的错误。
example.py
try:
pass
except FileNotFoundError:
pass
这段代码足以让Flake8产生错误提示。
$ flake8 example.py
example.py:3:8: F821 undefined name 'FileNotFoundError'
$ python example.py # no error
$ python3 example.py # no error
我查了一下Python文档,发现FileNotFoundError是一个“内置”的异常,所以我觉得不需要从其他地方导入它,而且我的Python解释器也没有对此提出任何问题,似乎只是flake8出现了问题。
3 个回答
除了Bryce的回答,还有一个方法可以避免让代码变得复杂,以适应语法检查工具,那就是在相关的代码行添加一个noqa
标记:
try:
open("bad_file")
except FileNotFoundError: # noqa: F821
print("file not found")
这个标记的意思就是告诉flake8在这一行忽略这个特定的错误。
我在Python代码质量工具的仓库里发现了几条关于这个问题的讨论。特别是第75个问题。
这里列出了两个解决方法。你可以使用--builtins
这个选项,来指定一个用逗号分隔的已知内置函数列表,这样flake8就不会再报错了。
$ flake8 example.py
example.py:3:8: F821 undefined name 'FileNotFoundError'
$ flake8 --builtins=FileNotFoundError,... example.py
$
另一个解决方法是用python3来运行flake8,而不是python2。
$ /usr/bin/python3.5 -m pyflakes example.py
$
希望这两个解决方案中的一个能对你有帮助,因为为了绕过语法检查工具而修改代码是得不偿失的。
我在运行python 2.7.8
的时候遇到了以下问题:
except FileNotFoundError:
NameError: name 'FileNotFoundError' is not defined
如果我改成用 OSError
,在 python 3
上就能正常工作了。
except OSError:
FileNotFoundError 是 python3
中 OSError
的一个子类。
使用 OSError
会捕捉到的不仅仅是 FileNotFound
错误,所以在 python 3
中你可能还需要添加其他的检查。
在 python 2
中,这个错误是 IOError
:
你可以捕捉到特定的错误:
import __builtin__
exc = getattr(__builtin__,"IOError","FileNotFoundError")
try:
(open("bad_file"))
except exc:
pass
当然还有更好的方法,但对于 python 3
来说:
try:
f = (open("bad_file"))
except OSError as e:
if isinstance(e, FileNotFoundError):
pass
else:
raise e