Flake8无法识别内置异常

时间:2014-08-14 13:15:56

标签: python githooks 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 docs,FileNotFoundError是一个'内置'异常,所以我认为我不应该从任何地方导入它,我的python解释器没有抱怨它,只是看起来喜欢flake8的问题。

2 个答案:

答案 0 :(得分:7)

运行python 2.7.8我得到了以下内容:

 except FileNotFoundError:
 NameError: name 'FileNotFoundError' is not defined

如果我更改为OSError,则可以在python 3

上正常使用
except OSError:

FileNotFoundErrorOSError

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忽略此特定行上的特定错误。