Próbuję zgłosić ostrzeżenie w Pythonie bez powodowania awarii / zatrzymania / przerwania programu.
Używam następującej prostej funkcji, aby sprawdzić, czy użytkownik przekazał do niego liczbę niezerową. Jeśli tak, program powinien ich ostrzec, ale kontynuować normalnie. To powinno działać jak poniżej kod, ale należy użyć klasy Warning()
, Error()
albo Exception()
zamiast drukować ostrzeżenie ręcznie.
def is_zero(i):
if i != 0:
print "OK"
else:
print "WARNING: the input is 0!"
return i
Jeśli użyję poniższego kodu i przekażę 0 do funkcji, program zawiesza się i wartość nigdy nie jest zwracana. Zamiast tego chcę, aby program działał normalnie i po prostu poinformował użytkownika, że przekazał 0 do funkcji.
def is_zero(i):
if i != 0:
print "OK"
else:
raise Warning("the input is 0!")
return i
Chcę mieć możliwość sprawdzenia, czy zostało wysłane ostrzeżenie, testując je przez unittest. Jeśli po prostu wydrukuję wiadomość, nie będę w stanie przetestować jej za pomocą assertRaises in unittest.
źródło
print
wiadomości?Odpowiedzi:
Nie powinieneś
raise
ostrzegać, powinieneś używaćwarnings
module. Podnosząc go, generujesz błąd, a nie ostrzeżenie.źródło
warnings.catch_warnings
menedżer kontekstu, który pozwoli ci to zrobić.Zobacz dokumentację Pythona: tutaj
źródło
warnings.warn("blabla", DeprecationWarning)
za dodanie klasy do rodzaju ostrzeżeniaDomyślnie, w przeciwieństwie do wyjątku, ostrzeżenie nie przerywa.
Następnie podczas generowania ostrzeżenia
import warnings
można określić klasę Warnings . Jeśli nie jest podany, jest onUserWarning
domyślny dosłownie .Aby zamiast tego po prostu użyć istniejącej klasy, np .
DeprecationWarning
:Tworzenie niestandardowej klasy ostrzeżeń jest podobne do tworzenia niestandardowej klasy wyjątków:
Aby przetestować, rozważ
assertWarns
lubassertWarnsRegex
.Jako alternatywę, szczególnie w przypadku samodzielnych aplikacji, rozważ
logging
moduł. Może rejestrować komunikaty o poziomie debugowania , informacji , ostrzeżenia , błędów , itp. Komunikaty dziennika o poziomie ostrzeżenia lub wyższym są domyślnie drukowane na stderr.źródło