Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 어설션(Assertion) 완벽 가이드: assert 문의 이해와 활용

어설션(assertion)은 프로그램의 테스트가 끝난 후 켜거나 끌 수 있는 일종의 안전 점검(sanity check) 장치입니다. 코드가 의도한 대로 동작하고 있는지 개발 단계에서 빠르게 확인할 수 있도록 도와주는 도구라고 할 수 있습니다.

어설션을 가장 쉽게 이해하는 방법은 raise-if 문(정확히는 raise-if-not 문)에 비유하는 것입니다. 즉, 특정 표현식을 검사하여 그 결과가 거짓(false)이면 예외를 발생시키는 방식으로 동작합니다.

어설션은 파이썬 1.5 버전에서 새롭게 도입된 키워드인 assert 문을 통해 수행됩니다.

실무에서 프로그래머들은 흔히 함수 시작 부분에 어설션을 배치해 유효한 입력값인지 검사하고, 함수 호출 이후에는 반환값이 올바른지 확인하는 용도로 사용합니다.

assert 문의 동작 원리

파이썬 인터프리터가 assert 문을 만나면 뒤따르는 표현식을 평가합니다. 이 표현식이 참(true)이기를 기대하며, 만약 거짓으로 평가되면 파이썬은 AssertionError 예외를 발생시킵니다.

assert 문의 기본 문법은 다음과 같습니다.

assert Expression[, Arguments]

어설션이 실패하면 파이썬은 두 번째 인자로 전달된 ArgumentExpressionAssertionError의 메시지로 사용합니다. 발생한 AssertionError는 다른 예외와 마찬가지로 try-except 문으로 잡아서 처리할 수 있지만, 별도로 처리하지 않으면 프로그램이 종료되면서 traceback(추적 정보)이 출력됩니다.

예제: 켈빈 온도를 화씨 온도로 변환하기

다음은 켈빈(Kelvin) 온도를 화씨(Fahrenheit) 온도로 변환하는 함수입니다. 켈빈 온도 0도는 이론상 가장 낮은 온도인 절대영도이므로, 음수 온도가 입력되면 함수 실행을 중단하도록 어설션을 설정했습니다.

#!/usr/bin/python3

def kelvin_to_fahrenheit(temperature):
    assert (temperature >= 0), "절대영도보다 낮은 온도입니다!"
    return ((temperature - 273) * 1.8) + 32

print(kelvin_to_fahrenheit(273))
print(int(kelvin_to_fahrenheit(505.78)))
print(kelvin_to_fahrenheit(-5))

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

32.0
451
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print(kelvin_to_fahrenheit(-5))
  File "test.py", line 4, in kelvin_to_fahrenheit
    assert (temperature >= 0), "절대영도보다 낮은 온도입니다!"
AssertionError: 절대영도보다 낮은 온도입니다!

앞의 두 호출은 정상적으로 결과를 반환하지만, 마지막 호출에서 음수 온도가 전달되자 어설션이 실패하고 AssertionError와 함께 지정한 오류 메시지가 출력되며 프로그램이 종료됩니다.

어설션 활용 시 주의 사항

어설션은 편리한 디버깅 도구이지만 몇 가지 유의할 점이 있습니다.

  • 파이썬은 -O(optimize) 옵션으로 실행하면 어설션을 모두 무시하므로, 운영 환경의 핵심 로직 검증 용도로는 적합하지 않습니다.
  • 어설션은 개발·테스트 단계에서 내부 상태나 계약 조건(precondition)을 빠르게 확인하는 데 가장 효과적입니다.
  • 사용자 입력 검증처럼 반드시 처리되어야 하는 오류는 try-except를 통한 명시적인 예외 처리로 구현하는 것이 좋습니다.

이처럼 assert 문을 적절히 활용하면 버그를 조기에 발견하고 코드의 신뢰성을 높일 수 있습니다.