Поднять предупреждение в Python без прерывания программы


Я имею дело с проблемой, как поднять предупреждение в Python, не позволяя программе аварийно завершить работу / остановить / прервать.

Я использую следующую простую функцию, которая проверяет, если пользователь перешел к его ненулевое число. Если пользователь передает ноль, программа должна предупредить пользователя, но продолжить нормально. Он должен работать, как следующий код, но он должен использовать предупреждение класса(), ошибка() или исключение() вместо того, чтобы печатать предупреждение вручную.

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 99

3 ответа:

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

import warnings
warnings.warn("Warning...........Message")

смотрите документацию python:здесь

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

после импорта 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.