2012-02-03 20 views
22

que estoy haciendo un poco de matemática sencilla recesiva en un script en Python y estoy recibiendo la advertencia siguiente:¿Cómo deshacerse de los mensajes de advertencia específicos en python manteniendo todas las otras advertencias como normales?

"Advertencia: división por cero encontrado en dividir".

Para proporcionar algún contexto, estoy tomando dos valores y tratando de encontrar la diferencia porcentual en el valor (a - b)/a y si su por encima de un cierto rango y luego procesarlo, pero a veces el valor de a o b es cero.

Quiero deshacerme de esta advertencia específica (en una línea específica) pero toda la información que he encontrado hasta ahora parece mostrarme cómo detener todas las advertencias (que no quiero).

Cuando he usado para escribir scripts de shell, lo que podía hacer algo como esto

code... 
more code 2 > error.txt 
even more code 

En ese ejemplo, me gustaría tener las advertencias para el 'código' y el comando 'aún más código' pero no para el segunda linea.

¿Esto es posible?

+0

¿Por qué no comprueba si aob = = 0 y no hacer el cálculo? – AlG

+0

Esa no es una advertencia de Python habitual, ¿puedes mostrar el código que estás ejecutando? –

+0

que debería ser una excepción, no una advertencia, ¿no? ¿No puedes atrapar el 'ZeroDivisionError'? – mpen

Respuesta

8

Es más fácil de arreglar las advertencias de suprimir silencio ellas:

if a == 0 or b == 0: 
    return False 

# Your actual code 

O si lo desea conseguir la suposición con la sintaxis de Python:

if not all([a, b]): 
    return False 

# Your actual code 

No es complicado de hacer, pero Todavía no lo haría. Desde el API:

numpy.seterr(divide='ignore') 
+0

Gracias Blender, eso fue lo primero que pensé, pero tenía curiosidad por saber si había una forma de suprimir un advertencia específica. Si no hay forma (o su locura es complicada, entonces seguiré tu enfoque) – Lostsoul

+1

si realmente está haciendo '(a-b)/a' luego verificando si a o b es cero es tonto. solo necesita verificar a! – mpen

+0

@ Mark: Eso es lo que originalmente pensé, pero cuando el OP dijo ** pero a veces el valor de aob es cero **, eso me confundió. – Blender

42

Si Scipy está utilizando el módulo warnings, entonces se puede suprimir advertencias específicas. Intente esto en el comienzo de su programa:

import warnings 
warnings.filterwarnings("ignore", message="divide by zero encountered in divide") 

Si quieres que esto se aplica sólo a una sección de código, a continuación, utilizar el gestor de contexto advertencias:

import warnings 
with warnings.catch_warnings(): 
    warnings.filterwarnings("ignore", message="divide by zero encountered in divide") 
    # .. your divide-by-zero code .. 
+0

¿Cómo? Vi que puedo apagar todas las advertencias pero ¿es posible orientar una línea de código específica? – Lostsoul

+0

¡oh, acabo de ver su actualización! Gracias, eso era lo que estaba buscando. Una pregunta más: ¿hay alguna forma específica de encontrar el mensaje de advertencia o simplemente se trata de lo que viene en la pantalla? Si recibo "Advertencia: ¡su código apesta, lostsoul!", Entonces simplemente puedo agregar eso a la variable de mensaje anterior y ¿funcionaría? – Lostsoul

+3

Buena respuesta. En realidad, me tomó una cantidad sorprendente de google para encontrar esta explicación ultra-simple de cómo ignorar las advertencias. @Lostsoul puede usar message = 'regex matching message' para capturar advertencias por mensaje, y también hay lineno = y module = argumentos para capturar por número de línea y nombre de módulo. – cxrodgers

Cuestiones relacionadas