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 ответов


запуск python 2.7.8 Я получаю следующее:

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

если я изменюсь на OSError он работает правильно на python 3

except OSError:

FileNotFoundError является наследником OSError на python3

используя 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

Я нашел пару упоминаний об этой проблеме на Качество Кода Python инструменты РЕПО. В частности,выпуск #75.

были перечислены два обходных пути. Вы можете использовать --builtins флаг, чтобы указать разделенный запятыми список известных встроенных элементов, которые Flake8 помечает.

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

другой обходной путь работает flake8 под python3 вместо python2.

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

надеюсь, одно из этих двух решений будет работать для вас, как скручивание кода для работы с инструментом проверки синтаксиса контрпродуктивно.