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


189

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

다음 간단한 함수를 사용하여 사용자가 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로 테스트 할 수 없습니다.


사용자에게 정확히 어떻게 알리고 싶습니까? 이메일이나 SMS를 통해? 연결될 수 있지만 구체적이어야합니다.
aaronasterling

2
print메시지 만 보내지 않습니까?
sje397

1
@ sje397 요점은 경고가 unittest에 의해 테스트되었다는 것을 테스트하고 싶다는 것입니다. 단순히 메시지를 인쇄하면 unittest에서 assertRaises를 사용하여 메시지를 인쇄 할 수 없습니다.
Tomas Novotny

답변:


157

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


1
대단히 감사합니다. 그러면 unittest를 사용하여 경고가 발생했는지 어떻게 테스트합니까? 더 이상 assertRaises ()를 사용할 수 없습니다.
Tomas Novotny

@Tomas Novotny는 stdout과 stderr을 캡처 한 다음 경고에 의해 발행 된 문자열이 내부에 있는지 확인합니다.
wheaties

15
@ Tomas : 경고를 테스트하려는 욕구를 들어 본 적이 없지만이 warnings.catch_warnings작업을 수행 할 수있는 컨텍스트 관리자 가 있습니다 .
SilentGhost

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

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


6
그리고 warnings.warn("blabla", DeprecationWarning)경고 종류에 클래스를 추가하기 위해
shadi

52

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

이후 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에 인쇄됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.