반응형
assert 활용하기
- assert는 파이썬에서 디버깅과 테스트에 자주 사용되는 키워드로, 특정 조건이 참인지 확인하고 그렇지 않으면 AssertionError를 발생시키는 역할을 합니다.
- 주로 프로그램 실행 도중에 예상하지 못한 상태가 발생했을 때 이를 잡아내기 위해 사용됩니다.
[assert 구문의 기본 형식]
assert condition, message
- condition: 참(True)이어야 하는 조건입니다. 이 조건이 거짓(False)이면 AssertionError가 발생합니다.
- message: (선택사항) 조건이 거짓일 때 표시할 오류 메시지입니다. 이 메시지는 디버깅에 도움이 됩니다.
[예제]
def divide(a, b):
assert b != 0, "The divisor b cannot be zero."
return a / b
print(divide(10, 2)) # 정상 출력: 5.0
print(divide(10, 0)) # AssertionError: The divisor b cannot be zero.
- 위 예제에서 divide 함수는 두 숫자를 나누기 전에 나누는 수(b)가 0이 아닌지 확인합니다.
- 만약 b가 0이라면 assert 문이 AssertionError와 함께 메시지를 출력합니다.
[assert의 용도]
- 디버깅: 코드가 의도한 대로 동작하는지 확인하는 데 사용됩니다. 예를 들어, 함수의 입력 값이 예상 범위 내에 있는지 확인할 수 있습니다.
- 테스트: 단위 테스트에서 특정 조건이 충족되는지 확인하는 데 사용됩니다. 예를 들어, 테스트 함수 내에서 예상 결과와 실제 결과를 비교할 때 유용합니다.
- 문서화: 코드의 가정을 명확히 하고, 다른 개발자가 코드를 읽을 때 이해를 돕기 위해 사용될 수 있습니다.
[예제: 디버깅]
def square_root(x):
# 입력 값이 음수가 아님을 디버깅 목적으로 확인
assert x >= 0, "Input must be non-negative"
return x ** 0.5
print(square_root(9)) # 출력: 3.0
print(square_root(-1)) # AssertionError: Input must be non-negative
- assert x >= 0, "Input must be non-negative": 입력 값이 음수가 아님을 확인합니다. 만약 x가 음수라면 AssertionError가 발생하며 메시지 "Input must be non-negative"가 출력됩니다. 이는 함수가 음수 입력을 받았을 때 예상치 못한 동작을 하지 않도록 방지합니다.
[예제: 테스트]
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3, "Test case 1 failed"
assert add(-1, 1) == 0, "Test case 2 failed"
assert add(0, 0) == 0, "Test case 3 failed"
test_add() # 모든 테스트 케이스가 통과하면 아무 메시지도 출력되지 않음
- def test_add(): add 함수의 테스트 케이스를 정의하는 함수입니다.
- assert add(1, 2) == 3, "Test case 1 failed": add(1, 2)의 결과가 3인지 확인합니다. 결과가 다르면 "Test case 1 failed" 메시지와 함께 AssertionError가 발생합니다.
- assert add(-1, 1) == 0, "Test case 2 failed": add(-1, 1)의 결과가 0인지 확인합니다. 결과가 다르면 "Test case 2 failed" 메시지와 함께 AssertionError가 발생합니다.
- assert add(0, 0) == 0, "Test case 3 failed": add(0, 0)의 결과가 0인지 확인합니다. 결과가 다르면 "Test case 3 failed" 메시지와 함께 AssertionError가 발생합니다.
[예제: 문서화]
def find_min(numbers):
"""
주어진 숫자 리스트에서 최솟값을 찾습니다.
리스트는 비어 있지 않아야 하며, 모든 요소는 숫자여야 합니다.
"""
# 리스트가 비어 있지 않음을 문서화
assert len(numbers) > 0, "The list of numbers must not be empty."
# 모든 요소가 숫자임을 문서화
assert all(isinstance(n, (int, float)) for n in numbers), "All elements in the list must be numbers."
min_value = numbers[0]
for number in numbers:
if number < min_value:
min_value = number
return min_value
print(find_min([3, 1, 4, 1, 5, 9, 2, 6, 5])) # 출력: 1
# 잘못된 사용: 리스트가 비어 있음
try:
print(find_min([]))
except AssertionError as e:
print(f"AssertionError: {e}") # 출력: AssertionError: The list of numbers must not be empty.
# 잘못된 사용: 리스트 요소가 숫자가 아님
try:
print(find_min([3, "a", 4]))
except AssertionError as e:
print(f"AssertionError: {e}") # 출력: AssertionError: All elements in the list must be numbers.
- assert len(numbers) > 0, "The list of numbers must not be empty.": 리스트가 비어 있지 않음을 확인합니다. 리스트가 비어 있으면 AssertionError가 발생하며 메시지 "The list of numbers must not be empty"가 출력됩니다.
- assert all(isinstance(n, (int, float)) for n in numbers), "All elements in the list must be numbers.": 리스트의 모든 요소가 숫자인지 확인합니다. 숫자가 아닌 요소가 있으면 AssertionError가 발생하며 메시지 "All elements in the list must be numbers"가 출력됩니다.
[assert 사용 시 주의사항]
- 성능: assert 문은 기본적으로 디버깅 목적으로 사용되며, 파이썬 인터프리터를 -O (optimize) 옵션과 함께 실행하면 assert 문이 무시됩니다. 따라서 성능이 중요한 코드에서는 assert를 남용하지 않는 것이 좋습니다.
- 예외 처리: assert는 예외를 처리하기 위한 도구가 아닙니다. 일반적인 오류 처리는 try-except 블록을 사용해야 합니다.
[결론]
- assert는 코드의 논리를 문서화하고 디버깅을 돕는 유용한 도구입니다.
- 올바르게 사용하면 코드의 품질을 향상시키고 유지 보수를 쉽게 할 수 있습니다.
반응형
'개발 > Python' 카테고리의 다른 글
[Python] Comprehensive Guide to Using "for" Loops (0) | 2024.07.24 |
---|---|
[파이썬, Python] pdb 활용법 총정리 (1) | 2024.07.17 |
[파이썬, Python] 제너레이터 활용법 총정리 (0) | 2024.07.15 |
[파이썬, Python] 디버깅 예시 총정리 (3) | 2024.07.15 |
[파이썬, Python] 코드 최적화 예시 총정리 (2) | 2024.07.14 |