2012-02-03 20 views
22

Sto facendo un po 'di semplice matematica recessiva in uno script python e sto ottenendo l'avvertimento segue:Come sbarazzarsi di specifici messaggi di avviso in python mantenendo tutti gli altri avvisi normalmente?

"Attenzione: divisione per zero incontrato nel dividere".

per fornire un certo contesto, mi prendo due valori e cercando di trovare la differenza per cento in valore (a - b)/a e se il suo al di sopra di un certo intervallo poi elaborarlo, ma a volte il valore di a o b è pari a zero.

Voglio sbarazzarmi di questo avvertimento specifico (su una linea specifica) ma tutte le informazioni che ho trovato finora sembrano mostrarmi come interrompere tutti gli avvertimenti (che non voglio).

Quando ho usato per scrivere script di shell, avrei potuto fare qualcosa di simile

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

In questo esempio, vorrei ottenere gli avvertimenti per il 'codice' e il comando 'ancora piu codice', ma non per il seconda linea.

È possibile?

+0

perché non se ao b = = 0 e non eseguire il calcolo? – AlG

+0

Questo non è un normale avvertimento Python, puoi mostrare il codice che stai usando? –

+0

che dovrebbe essere un'eccezione, non un avvertimento, no? non riesci a catturare il 'ZeroDivisionError'? – mpen

risposta

8

E 'più facile per risolvere gli avvertimenti che a loro sopprimere in silenzio:

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

# Your actual code 

Oppure, se si vuole ottenere fantasia con la sintassi di Python:

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

# Your actual code 

Non è complicato da fare, ma Ancora non lo farei. Dal API:

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

Grazie Blender, questo è stato il mio primo pensiero ma ero solo curioso di sapere se c'era un modo per sopprimere un avvertimento specifico. Se non c'è modo (o è pazzo complicato, allora seguirò il tuo approccio) – Lostsoul

+1

se sta davvero facendo '(a-b)/a', quindi controllando se a o b è zero è sciocco. ha solo bisogno di controllare un! – mpen

+0

@Mark: Questo è quello che pensavo inizialmente, ma quando l'OP diceva ** ma a volte il valore di a o b è zero **, questo mi ha confuso. – Blender

42

Se SciPy sta usando il modulo warnings, allora si può sopprimere avvertimenti specifici. Prova questo, all'inizio del programma:

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

Se si vuole che questo si applica a una sola sezione di codice, quindi utilizzare il manager avvertimenti contesto:

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

Come? Ho visto che posso disattivare tutti gli avvisi, ma è possibile indirizzare una linea di codice specifica? – Lostsoul

+0

oh ho appena visto il tuo aggiornamento! .. Grazie era quello che stavo cercando. Un'altra domanda, c'è un modo specifico per trovare il messaggio di avviso o è semplicemente quello che sta arrivando sullo schermo? Se ricevo "Attenzione: il tuo codice fa schifo, lostsoul!", Allora posso solo aggiungere quello alla variabile del messaggio sopra e funzionerebbe? – Lostsoul

+3

Bella risposta. In realtà mi ci è voluta una quantità sorprendente di googling per trovare questa spiegazione semplicissima su come ignorare gli avvertimenti. @Lostudio è possibile utilizzare message = 'regex matching message' per catturare gli avvisi per messaggio, e ci sono anche lineno = e module = argomenti da prendere per numero di riga e nome del modulo. – cxrodgers

Problemi correlati