Programing

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

crosscheck 2020. 6. 14. 10:34
반응형

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


프로그램 충돌 / 중지 / 인터럽트를 허용하지 않고 Python에서 경고를 발생시키는 방법에 대한 문제를 다루고 있습니다.

사용자가 0이 아닌 숫자를 전달했는지 확인하는 다음과 같은 간단한 기능을 사용합니다. 사용자가 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 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 , warning , error의 레벨을 가진 메시지를 로그 할 수 있습니다 . 경고 레벨 이상의 로그 메시지 는 기본적으로 stderr에 인쇄됩니다.

참고 URL : https://stackoverflow.com/questions/3891804/raise-warning-in-python-without-interrupting-program

반응형