개요
Python으로 프로그래밍을 하다 보면 자연스럽게 여러 가지 종류의 경고 메세지를 보게 된다. 당장 해결해야 하는 문제는 아지만 추후 오류로 발전할 수 있기 때문에 확인한 메세지에 대해서 조치하는 편이 좋지만, 여러 가지 이유로 조치할 수 없을 수도 있다.
다만 과다한 경고 메세지로 인해 실행 로그가 지나치게 길어지게 되는 경우에는, 스토리지 용량과 관련된 문제를 야기할 수 있다. 따라서 이런 경우에는 로그 메세지를 무시할 수 있도록 조치할 필요가 있다.
이번 글에서는 warnings 모듈을 이용해 경고 메세지를 출력하지 않도록 하는 방법을 적어둔다.
warnings
개발자는 프로그램 실행 도중 예외가 발생하거나 프로그램을 종료된다고 보장할 수 없는 특정 조건에 대해 경고할 필요가 있을 때 경고 메세지를 출력시킨다. Python에서는 경고를 다룰 수 있는 warnings 모듈을 사용하여 경고에 대한 메세지를 출력시키거나 경고를 무시하거나, 예외로 변경할 수 있다.
경고를 제어할 때는 경고 필터를 통해 발생한 경고에 대한 메세지를 출력할지 결정하고, 어떤 형태로 출력할지 결정하게 된다.
경고 범주/필터
경고 필터는 특정 범주의 경고(category)의 처리 방식(action)을 제어한다.
경고의 범주를 의미하는 category는 Warning의 서브 클래스여아 하며, warning 클래스에 내장된 경고 범주는 아래와 같다.
category / class | 설명 |
Warning | 기본 클래스로 Exception의 서브 클래스이다. |
UserWarning | |
DeprecationWarning | 프로그램 개발자를 위한 폐지된 기능 경고 |
SyntaxWarning | 모호한 구문 경고 |
RuntimeWarning | 모호한 런타임 기능 경고 |
FutureWarning | 프로그램의 최종 사용자를 위한 폐지된 기능 경고 |
PendingDeprecationWarning | 향후 폐지될 기능 경고 |
ImportWarning | 모듈을 임포트하는 과정에서 트리거되는 경고 |
UnicodeWarning | 유니코드와 관련된 경고 |
BytesWarning | bytes, bytearray와 관련된 경고 |
ResourceWarning | 리소스 사용량과 관련된 경고 |
그리고 경고의 처리 방식의 의미하는 action은 다음과 같은 종류가 존재한다.
action | 처리 |
default | 각 위치에 대해 첫 번째로 일치한 경고를 출력한다. |
error | 해당 경고를 예외로 변경한다. |
ignore | 해당 경고를 인쇄하지 않는다. |
always | 해당 경고를 항상 출력한다. |
module | 모듈 당 첫 번째로 일치한 경고를 출력한다. |
once | 경고가 발생한 위치에 상관 없이 첫 번째로 일치한 경고를 출력한다. |
일시적인 경고 제어
발생한 경고 메세지를 일시적으로 제어할 때는 warnings.simplefilter 함수를 사용한다.
warnings.simplefilter(action, category=Warning, lineno=0, append=False)
경고 메세지를 무시하려는 이 글의 경우에는 warnings.simplefilter의 action 매개변수를 ignore로 지정한다. 제어하려는 경고를 따로 지정하지 않으면 모든 경고를 대상으로 동작한다.
예시로 아래와 같이 경고를 발생시키는 함수가 정의되어 있다고 하자.
def fxn():
warnings.warn("deprecated", DeprecationWarning)
print('test')
함수를 실행해보면, 함수 자체는 정상적으로 실행되지만 경고 메세지가 출력되는 모습을 확인할 수 있다. 이런 경고 메세지는 아래 코드로 출력되지 않게 제어할 수 있다.
warnings.simplefilter(action='ignore', category=DeprecationWarning)
참고 문서
https://docs.python.org/ko/3/library/warnings.html
https://www.geeksforgeeks.org/warnings-in-python/