我在flake8上设置了一个严格的预提交钩子(Hook),所以直到它高兴时我才能提交。这通常是一件好事,但是却引起了一些问题,而这些问题似乎根本没有问题。

我无法让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一样。

最佳答案

运行python 2.7.8我得到了关注:

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

如果我更改为OSError,则可以在python 3上正常工作
except OSError:

FileNotFoundErrorOSErrorpython3的子类

使用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

关于python - Flake8无法识别内置异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25308968/

10-14 14:29
查看更多