【问题标题】:Flake8 Not Recognizing built-in exceptionFlake8 无法识别内置异常
【发布时间】:2014-10-08 03:49:05
【问题描述】:

我用 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 的问题。

【问题讨论】:

    标签: python githooks flake8


    【解决方案1】:

    运行 python 2.7.8 我得到以下信息:

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

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

    except OSError:
    

    FileNotFoundErrorpython3OSError 的子类

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

    【讨论】:

    • 我在2.7.6 中没有收到该错误,但我想我可以更改为 OSError。
    • @NateMara,在 python 2 中是 IOError,但在 python 3 中是 OSError
    • 这是一个 pyflakes 问题,不是关于实现细节的问题。我认为 OP 问题的根本原因很可能是 pyflakes 在 python 2 下运行。有关可能更合适的解决方案,请参阅下面@Bryce 的评论。
    • 在这种情况下重写代码 - 这不是一个好主意。您应该为 flake8 提供正确的配置。 @Bryce 答案是这种情况下的更好选择
    【解决方案2】:

    我在Python Code Quality 工具库中发现了一些关于此问题的提及。特别是Issue #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 
    $ 
    

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-11-16
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        • 2011-11-14
        • 2019-04-06
        相关资源
        最近更新 更多