Поднять предупреждение в Python без прерывания программы - PullRequest
129 голосов
/ 08 октября 2010

Я имею дело с проблемой, как вывести предупреждение в 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.

Ответы [ 3 ]

212 голосов
/ 08 октября 2010
import warnings
warnings.warn("Warning...........Message")

См. Документацию по питону: здесь

104 голосов
/ 08 октября 2010

Вы не должны raise предупреждение, вы должны использовать warnings модуль. Повышая его, вы генерируете ошибку, а не предупреждение.

28 голосов
/ 23 марта 2018

По умолчанию, в отличие от исключения, предупреждение не прерывается.

После import warnings можно указать класс Warnings при создании предупреждения.Если он не указан, он буквально UserWarning по умолчанию.

>>> warnings.warn('This is my lazy warning.')
<string>:1: UserWarning: This is my lazy warning.

Просто использовать взамен ранее существующий класс, например, Warning:

>>> warnings.warn('This is my generic warning.', Warning)
<string>:1: Warning: This is my generic warning.

Создание настраиваемого класса предупреждения аналогично созданию настраиваемого класса исключения:

>>> class MyCustomWarning(UserWarning):
...     pass
... 
... warnings.warn('This is my custom warning.', MyCustomWarning)

<string>:1: MyCustomWarning: This is my custom warning.

Для тестирования рассмотрим assertWarns или assertWarnsRegex.


В качестве альтернативы, особенно для автономных приложений, рассмотрим модуль logging.Он может регистрировать сообщения с уровнем debug , info , предупреждение , error и т. Д. Регистрировать сообщения с уровнем предупреждение или выше по умолчанию печатаются в stderr.

...