我有一个严格的预提交钩子设置与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 docs,FileNotFoundError是一个'内置'异常,所以我认为我不应该从任何地方导入它,我的python解释器没有抱怨它,只是看起来喜欢flake8的问题。
答案 0 :(得分:7)
运行python 2.7.8
我得到了以下内容:
except FileNotFoundError:
NameError: name 'FileNotFoundError' is not defined
如果我更改为OSError
,则可以在python 3
except OSError:
FileNotFoundError是OSError
python3
的子类
使用OSError
将捕获的不仅仅是python 3中的FileNotFound
错误,因此您可能需要添加其他检查。
对于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
答案 1 :(得分:0)
除了Bryce的回答外,另一个避免扭曲代码以适合语法检查工具的选项是在相关行中添加noqa
标志:
try:
open("bad_file")
except FileNotFoundError: # noqa: F821
print("file not found")
这只是告诉flake8忽略此特定行上的特定错误。