Python

[Python] warnings - warning 메세지 무시하기

비번변경 2024. 4. 3. 22:42

개요

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/

 

728x90