Подтвердить что ты не робот

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.

4b9b3361

Ответ 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 игнорировать эту конкретную ошибку в этой конкретной строке.