2012-02-03 14 views
22

robie kilka prostych matematyki recesywnie w skrypcie Pythona i otrzymuję ostrzeżenie następująco:Jak pozbyć się określonych komunikatów ostrzegawczych w pythonie, zachowując wszystkie pozostałe ostrzeżenia w normalny sposób?

„Ostrzeżenie: dzielenie przez zero napotkany w przepaści”.

Aby dostarczyć pewien kontekst, Biorę dwie wartości i stara się znaleźć różnicę procentową wartość (a - b)/a a jeśli jej powyżej pewnego zakresu następnie przetwarza je, ale czasami wartość a lub b wynosi zero.

Chcę się pozbyć tego konkretnego ostrzeżenia (w konkretnym wierszu), ale wszystkie informacje, które znalazłem do tej pory, wydają mi się pokazywać, jak zatrzymać wszystkie ostrzeżenia (których nie chcę).

Kiedy używany do pisania skryptów powłoki, mogę zrobić coś takiego

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

W tym przykładzie, chciałbym dostać ostrzeżenia dla „kod” i polecenie "nawet więcej kodu, ale nie dla druga linia.

Czy to możliwe?

+0

Dlaczego nie sprawdzić, jeśli a lub b = = 0 i nie wykonać obliczeń? – AlG

+0

To nie jest zwykłe ostrzeżenie w języku Python, czy możesz pokazać kod, który używasz? –

+0

, który powinien być wyjątkiem, a nie ostrzeżeniem, nie? nie możesz złapać 'ZeroDivisionError'? – mpen

Odpowiedz

8

Łatwiej naprawić ostrzeżenia niż dyskretnie je stłumić:

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

# Your actual code 

Lub jeśli chcesz uzyskać fantazyjne z Pythona składnię:

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

# Your actual code 

To nie jest skomplikowane do zrobienia, ale Nadal by tego nie zrobiłem. Z API:

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

Dzięki Blender, to była moja pierwsza myśl, ale byłem ciekawy, czy istnieje sposób na stłumienie specjalne ostrzeżenie. Jeśli nie ma sposobu (lub jego zwariowana komplikacja, to podążę za twoim podejściem) – Lostsoul

+1

jeśli naprawdę robi '(a-b)/a', to sprawdzenie, czy a lub b jest równe zero, jest głupie. on po prostu musi sprawdzić! – mpen

+0

@ Mark: Tak właśnie myślałem, ale kiedy OP powiedział **, ale czasami wartość a lub b wynosi zero **, to mnie zdezorientowało. – Blender

42

Jeśli scipy jest za pomocą modułu warnings, to można stłumić konkretne ostrzeżenia. Spróbuj tego na początku programu:

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

Jeśli chcesz to zastosowanie tylko do jednej sekcji kodu, a następnie użyć menedżera kontekstowe ostrzeżenia:

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

Jak? Widziałem, że mogę wyłączyć wszystkie ostrzeżenia, ale czy możliwe jest kierowanie na określoną linię kodu? – Lostsoul

+0

O, właśnie zobaczyłem twoją aktualizację! .. Dzięki temu właśnie tego szukałem. Jeszcze jedno pytanie: czy istnieje konkretny sposób na znalezienie ostrzeżenia lub czy jest to po prostu to, co pojawia się na ekranie? Jeśli otrzymam komunikat "Ostrzeżenie: Twój kod jest do bani, zagubiony!", To mogę to dodać do powyższej zmiennej komunikatu i będzie działać? – Lostsoul

+3

Dobra odpowiedź. Właściwie to zaskoczyło mnie szukanie tego wyjątkowo prostego wyjaśnienia, jak ignorować ostrzeżenia. @Lostsoul możesz użyć message = 'regex matching message', aby wyłapać ostrzeżenia za pomocą wiadomości, oraz są również pościelo = i moduł = argumenty, które można przechwytywać po numerze linii i nazwie modułu. – cxrodgers

Powiązane problemy