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, а FileNotFoundError - это "встроенное" исключение, поэтому я не думаю, что мне нужно будет импортировать его из любого места и мои переводчики-питоны не жаловались на это, просто похоже на проблему с flake8.
Ответы
Ответ 1
Запуск 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
Ответ 2
Я нашел пару упоминаний об этой проблеме в Python Code Quality инструментах репо. В частности Проблема № 75.
Были перечислены два метода обхода. Вы можете использовать флаг --builtins
для указания списка разделенных запятыми известных встроенных компонентов, отмеченных флаером8.
$ 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
$
Надеемся, что одно из этих двух решений будет работать для вас, поскольку скручивание кода для работы с инструментом проверки синтаксиса является контрпродуктивным.
Ответ 3
В дополнение к ответу Брайса, другой вариант, который позволяет избежать искажения кода для соответствия инструменту проверки синтаксиса, заключается в добавлении флага noqa
к соответствующей строке:
try:
open("bad_file")
except FileNotFoundError: # noqa: F821
print("file not found")
Это просто говорит flake8 игнорировать эту конкретную ошибку в этой конкретной строке.