Я пытаюсь поднять предупреждение в Python без сбоя программы / остановки / прерывания.
Я использую следующую простую функцию, чтобы проверить, передал ли пользователь ненулевое число. Если это так, программа должна предупредить их, но продолжить как обычно. Он должен работать , как код ниже, но следует использовать класс Warning()
, Error()
или Exception()
вместо того , чтобы печатать предупреждение вручную.
def is_zero(i):
if i != 0:
print "OK"
else:
print "WARNING: the input is 0!"
return i
Если я использую приведенный ниже код и передаю 0 функции, программа завершается сбоем, и значение никогда не возвращается. Вместо этого я хочу, чтобы программа продолжала нормально и просто информировала пользователя, что он передал 0 функции.
def is_zero(i):
if i != 0:
print "OK"
else:
raise Warning("the input is 0!")
return i
Я хочу иметь возможность проверить, что было выдано предупреждение, проверяя его на unittest. Если я просто распечатываю сообщение, я не могу проверить его с помощью assertRaises в unittest.
источник
print
сообщение?Ответы:
Вы не должны
raise
предупреждать, вы должны использоватьwarnings
модуль. Повышая его, вы генерируете ошибку, а не предупреждение.источник
warnings.catch_warnings
менеджер контекста, который позволит вам сделать это.Смотрите документацию по питону: здесь
источник
warnings.warn("blabla", DeprecationWarning)
для добавления класса к виду выдаваемого предупрежденияПо умолчанию, в отличие от исключения, предупреждение не прерывается.
После
import warnings
этого можно указать класс Warnings при создании предупреждения. Если один не указан, он буквальноUserWarning
по умолчанию.Чтобы просто использовать ранее существующий класс, например
DeprecationWarning
:Создание настраиваемого класса предупреждений аналогично созданию настраиваемого класса исключений:
Для тестирования рассмотрите
assertWarns
илиassertWarnsRegex
.В качестве альтернативы, особенно для автономных приложений, рассмотрим
logging
модуль. Он может регистрировать сообщения, имеющие уровень отладки , информации , предупреждения , ошибки и т. Д. Сообщения журнала, имеющие уровень предупреждения или выше, по умолчанию печатаются в stderr.источник