Una biblioteca de terceros (escrita en C) que uso en mi código Python está emitiendo advertencias. Quiero poder usar la try
except
sintaxis para manejar adecuadamente estas advertencias. ¿Hay alguna forma de hacer esto?
python
exception
exception-handling
warnings
Boris Gorelik
fuente
fuente
warnings.filterwarnings
hace exactamente lo que quieres, no entiendo cuál es tu problema?warnings.filterwarnigns('error')
hace el trabajo. No puedo encontrar la respuesta original que propuso esta soluciónRespuestas:
Para citar del manual de Python ( 27.6.4. Advertencias de prueba ):
fuente
try
except
sintaxis.fnx
devuelve algo, conserva ese resultado (y aún puede administrar la advertencia).fxn()
no devuelva una advertencia,w
habrá una lista vacía. Siw
es una lista vacía (es decir[]
), a continuación, ejecutar el código le dará el siguiente error:IndexError: list index out of range
. Si solo está buscando formatear o verificar las propiedades de las advertencias capturadas, entonces es mejor usar un bucle for:for x in w: print(f'{x.category.__name__}: {str(x.message)}')
Para manejar las advertencias como errores, simplemente use esto:
Después de esto, podrá detectar las mismas advertencias que los errores, por ejemplo, esto funcionará:
PD Agregó esta respuesta porque la mejor respuesta en los comentarios contiene errores ortográficos: en
filterwarnigns
lugar defilterwarnings
.fuente
filterwarnings
llamada para capturarWarnings
, al menos en Python 3. simplemente funciona.Si solo desea que su secuencia de comandos falle en las advertencias, puede usar:
fuente
Aquí hay una variación que aclara cómo trabajar solo con sus advertencias personalizadas.
fuente
En algunos casos, es necesario utilizar ctypes para convertir las advertencias en errores. Por ejemplo:
fuente
warnings.simplefilter('error')
, no obtendrá el rastreo de la advertencia que vio en los registros, sino que obtendrá los rastreos de las advertencias previamente filtradas. El usosimplefilter
también es la forma más rápida de llegar a su respuesta si tiene alguna invocación de CLI.