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
$
надеюсь, одно из этих двух решений будет работать для вас, как скручивание кода для работы с инструментом проверки синтаксиса контрпродуктивно.