프로그램을 중단하지 않고 파이썬에서 경고 발생 return i 아래

프로그램 충돌 / 중지 / 중단없이 파이썬에서 경고를 올리려고합니다.

다음 간단한 함수를 사용하여 사용자가 0이 아닌 숫자를 전달했는지 확인합니다. 그렇다면, 프로그램은 경고를하지만 정상적인대로 계속 진행해야합니다. 그것은 아래의 코드처럼 작동해야하지만 클래스를 사용한다 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에서 경고를 테스트했는지 테스트하고 싶습니다. 단순히 메시지를 인쇄하면 unittest에서 assertRaises로 테스트 할 수 없습니다.



답변

당신은 안된다 raise, 당신은 경고 사용해야 warnings모듈을. 그것을 높이면 경고가 아닌 오류가 발생합니다.


답변

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

파이썬 문서를 참조하십시오 : here


답변

기본적으로 예외와 달리 경고는 중단되지 않습니다.

이후 import warnings에는 경고 를 생성 할 때 경고 클래스 를 지정할 수 있습니다 . 하나를 지정하지 않으면 문자 그대로 UserWarning기본적으로 사용됩니다.

>>> warnings.warn('This is a default warning.')
<string>:1: UserWarning: This is a default warning.

단순히 대신 기존 클래스를 사용하려면, 예를 들면 DeprecationWarning:

>>> warnings.warn('This is a particular warning.', DeprecationWarning)
<string>:1: DeprecationWarning: This is a particular 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 , warning , error 등 의 레벨을 가진 메시지를 로그 할 수 있습니다 . 경고 레벨 이상의 로그 메시지 는 기본적으로 stderr에 인쇄됩니다.


답변