23

我用 flake8 设置了一个严格的预提交挂钩,所以在它满意之前我不能提交。这通常是一件好事,但它会导致一些看起来根本没有问题的问题。

我无法让 Flake8 识别FileNotFoundError.

例子.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 的一个问题。

4

3 回答 3

23

我在Python 代码质量工具 repo中发现了一些关于这个问题的内容。具体问题 #75

列出了两种解决方法。您可以使用该--builtins标志指定 flake8 正在标记的已知内置函数的逗号分隔列表。

$ flake8 example.py
example.py:3:8: F821 undefined name 'FileNotFoundError'
$ flake8 --builtins=FileNotFoundError,... example.py
$ 

另一种解决方法是在 python3 而不是 python2 下运行 flake8。

$ /usr/bin/python3.5 -m pyflakes example.py 
$ 

希望这两种解决方案中的一种对您有用,因为扭曲您的代码以解决语法检查工具会适得其反。

于 2015-12-21T02:39:46.673 回答
10

运行 python2.7.8我得到以下信息:

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

如果我更改为OSError它可以正常工作python 3

except OSError:

FileNotFoundErrorOSErrorin的子类python3

UsingOSError将捕获的不仅仅是FileNotFoundpython 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
于 2014-08-14T13:25:40.917 回答
0

除了 Bryce 的回答之外,另一个避免扭曲代码以适应语法检查工具的选项是noqa在相关行中添加一个标志:

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

这只是告诉 flake8 忽略此特定行上的此特定错误。

于 2019-09-06T13:02:16.630 回答