Flake8 不识别内置异常

23 投票
3 回答
8165 浏览
提问于 2025-04-18 17:17

我设置了一个严格的提交前检查,使用的是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 个回答

0

除了Bryce的回答,还有一个方法可以避免让代码变得复杂,以适应语法检查工具,那就是在相关的代码行添加一个noqa标记:

try:
    open("bad_file")
except FileNotFoundError: # noqa: F821
    print("file not found")

这个标记的意思就是告诉flake8在这一行忽略这个特定的错误。

23

我在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 
$ 

希望这两个解决方案中的一个能对你有帮助,因为为了绕过语法检查工具而修改代码是得不偿失的。

10

我在运行python 2.7.8的时候遇到了以下问题:

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

如果我改成用 OSError,在 python 3 上就能正常工作了。

except OSError:

FileNotFoundErrorpython3OSError 的一个子类。

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

撰写回答