본문 바로가기

Python/중급

Python - asser

assert란

  • 조건을 테스트하는 디버깅 문: 운영환경에서는 사용 하지 않음
  • 조건이 참이면 정상적으로 실행이 계속됩니다.
  • 거짓이면 AssertionError가 발생

✔️ 사용 사례

  • 함수 인수 또는 출력이 유효한지 확인
  • 프로그램을 실행하는 동안 특정 조건이 사실인지 확인

문장 구조

✔️ 기본 문장

assert condition

 

✔️ 메시지 포함

assert condition, message

예제 코드

✔️ 조건이 참이면 정상적으로 실행

x = 10
assert x > 0, "x must be positive"

 

✔️ 조건이 거짓이면 AssertionError 발생

x = -10
assert x > 0, "x must be positive"

실행 결과

Traceback (most recent call last):
  File "assert.py", line 2, in <module>
    assert x > 0, "x must be positive"
AssertionError: x must be positive

사용 사례

✔️ 입력 유효성: 입력 인수가 사전 조건을 충족하는지 확인

def divide(a, b):
    assert b != 0, "Division by zero!"
    return a / b


print(divide(10, 2))  # 5.0
print(divide(10, 0))  # AssertionError: Division by zero!

 

✔️ 출력 확인: 실행 후 사후 조건이 유지되는지 확인

def calculate_discount_price(original_price, discount_rate):
    discounted_price = original_price * (1 - discount_rate)
    assert discounted_price >= 0, "할인된 가격은 음수가 될 수 없습니다"
    return discounted_price


print(calculate_discount_price(100, 0.2))  # 80.0
print(calculate_discount_price(100, 1.2))  # AssertionError: 할인된 가격은 음수가 될 수 없습니다

 

✔️ 불변성 검사: 실행 중에 조건이 계속 참인지 확인

def increment(counter):
    counter += 1
    assert counter >= 0, "Counter cannot be negative"
    return counter


print(increment(2))  # 1
print(increment(-5))  # AssertionError: Counter cannot be negative

디버깅 목적

  • assertion은 운영 환경에서 사용하기 위한 것이 아님 - 디버깅 목적으로 사용
  • 최적화 모드(python -O)에서 Python은 모든 assertion을 무시
  • 가정을 더 이상 확인할 필요가 없는 운영 환경에서 성능상의 이점을 얻을 수 있음

sript.py

x = -10
assert x > 0, "x must be positive"
print("x is positive")

 

✔️ 일반 실행

python script.py
# 실행 결과
# Traceback (most recent call last):
#   File "script.py", line 2, in <module>
#     assert x > 0, "x must be positive"
# AssertionError: x must be positive

 

✔️ 최적화 모드 실행

python -O script.py
# 실행 결과
# x is positive

Assertion과 Exception의 차이

  • Assertion: 개발 중에 "절대 발생하면 안 되는" 조건을 확인하기 위한 것. 일반적인 오류 처리에 사용되지 않음.
  • Exception: 런타임 중 예상되는 오류를 처리하는 데 사용(예: ValueError, TypeError).

✔️ 런타임 오류 처리를 위한 예외 사용 예시:

def divide(a, b):
    if b == 0:
        raise ValueError("0으로 나눌 수 없습니다")
    return a / b


print(divide(10, 2))  # 5.0
print(divide(10, 0))  # ValueError: 0으로 나눌 수 없습니다

 

실행 결과

5.0
Traceback (most recent call last):
  File "exception.py", line 8, in <module>
    print(divide(10, 0))  # ValueError: 0으로 나눌 수 없습니다
  File "exception.py", line 3, in divide
    raise ValueError("0으로 나눌 수 없습니다")

 

✔️ 운영 환경에서는 명시적인 오류 처리

class InvalidAgeError(Exception):
    pass

def check_age(age):
    if age < 0:
        raise InvalidAgeError("나이는 음수가 될 수 없습니다")


try:
    check_age(-10)
except InvalidAgeError as e:
    print(e)

 

실행 결과

나이는 음수가 될 수 없습니다

'Python > 중급' 카테고리의 다른 글

Python - 비동기 프로그램(asyncio)  (0) 2024.07.15
Python - 중급 07 (decorator)  (0) 2024.01.10
Python - 중급 06 (closure)  (0) 2024.01.10
Python - 중급 05 (generator)  (0) 2024.01.10
Python - 중급 04 (iterator)  (0) 2024.01.10