Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flake8 Not Recognizing built-in exception

Tags:

I have a strict pre-commit hook set up with flake8, so I can't commit until its happy. This is normally a good thing, but it is causing some problems with what seems like no problem at all.

I can't get Flake8 to recognize a FileNotFoundError.

example.py

try:     pass except FileNotFoundError:     pass 

This is enough code to get Flake8 to generate the error

$ flake8 example.py example.py:3:8: F821 undefined name 'FileNotFoundError' $ python example.py # no error $ python3 example.py # no error 

I checked the python docs, and FileNotFoundError is a 'built-in' exception, so I don't think I should have to import it from anywhere, and my python interpreters have not complained about it, just seems like an issue with flake8.

like image 363
Lily Mara Avatar asked Aug 14 '14 13:08

Lily Mara


2 Answers

I found a couple of mentions of this issue on the Python Code Quality tools repo. Specifically Issue #75.

Two workarounds were listed. You can use the --builtins flag to specify a comma separated list of known builtins that flake8 is flagging.

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

The other workaround is running flake8 under python3 instead of python2.

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

Hopefully one of these two solutions will work out for you, as twisting your code up to work around a syntax check tool is counterproductive.

like image 85
b-jazz Avatar answered Oct 20 '22 00:10

b-jazz


Running python 2.7.8 I get the follwoing:

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

If I change to OSError it works correctly on python 3

except OSError: 

FileNotFoundError is a subclass of OSError in python3

Using OSError will catch more than just the FileNotFound error in python 3 so you may want to add additional checks.

For python 2 it is an IOError:

You can catch the specific error:

import __builtin__  exc = getattr(__builtin__,"IOError","FileNotFoundError")  try:     (open("bad_file")) except exc:     pass 

Sure there are betters ways but for python 3:

try:     f = (open("bad_file")) except OSError as e:     if isinstance(e, FileNotFoundError):         pass     else:         raise e 
like image 44
Padraic Cunningham Avatar answered Oct 19 '22 22:10

Padraic Cunningham