python - Flake8 no reconoce la excepción incorporada
githooks (2)
Ejecutando python 2.7.8
me sale el siguiente:
except FileNotFoundError:
NameError: name ''FileNotFoundError'' is not defined
Si cambio a OSError
, funciona correctamente en python 3
except OSError:
FileNotFoundError es una subclase de OSError
en python3
El uso de OSError
detectará más que solo el error FileNotFound
en python 3, por lo que es posible que desee agregar verificaciones adicionales.
Para python 2
es un IOError
:
Puede detectar el error específico:
import __builtin__
exc = getattr(__builtin__,"IOError","FileNotFoundError")
try:
(open("bad_file"))
except exc:
pass
Claro que hay mejores maneras, pero para Python 3:
try:
f = (open("bad_file"))
except OSError as e:
if isinstance(e, FileNotFoundError):
pass
else:
raise e
Tengo un gancho de precompromiso estricto configurado con flake8, por lo que no puedo comprometerme hasta que esté satisfecho. Normalmente esto es bueno, pero está causando algunos problemas con lo que parece no ser ningún problema.
No puedo hacer que Flake8 reconozca un FileNotFoundError
.
example.py
try:
pass
except FileNotFoundError:
pass
Este es un código suficiente para que Flake8 genere el error.
$ flake8 example.py
example.py:3:8: F821 undefined name ''FileNotFoundError''
$ python example.py # no error
$ python3 example.py # no error
Revisé los documentos de Python , y FileNotFoundError es una excepción ''incorporada'', por lo que no creo que deba importarlo desde cualquier lugar, y mis intérpretes de Python no se han quejado, simplemente parece ser un problema con Flake8.
Encontré un par de menciones de este problema en el repositorio de herramientas de Calidad de Código Python . Específicamente el número 75 .
Dos soluciones fueron enumeradas. Puede usar el indicador --builtins
para especificar una lista separada por comas de elementos incorporados conocidos que flake8 está marcando.
$ flake8 example.py
example.py:3:8: F821 undefined name ''FileNotFoundError''
$ flake8 --builtins=FileNotFoundError,... example.py
$
La otra solución es ejecutar flake8 en python3 en lugar de python2.
$ /usr/bin/python3.5 -m pyflakes example.py
$
Con suerte, una de estas dos soluciones funcionará para usted, ya que torcer su código para solucionar una herramienta de verificación de sintaxis es contraproducente.