해당 글을 작성하면서 아래 블로그와 위키독스 내용을 참고했음을 밝힙니다.
방어적 프로그래밍 - http://statkclee.github.io/xwmooc-sc/novice/python/05-defensive.html
연오의 파이썬 - https://python.bakyeono.net/chapter-9-4.html
핵심만 간단히, Hello World! - https://wikidocs.net/21050
데이터캠프 강의에서 engineering을 공부하다가 assert 라는 python 함수를 마주했습니다. raise랑 무슨 차이지하면서 찾은 내용을 정리해보겠습니다.
assert는 가정 설정문입니다. assert는 아래 코드처럼 assert [조건문], [메시지](생략가능)과 같은 형식으로 사용됩니다.
# assert [조건문]
a = 3
assert a == 2
print("True")
# Result Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
# assert [조건문], [메시지]
a = 3
assert a == 2, "a i s not 2"
# Result Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: a is not 2
위의 상황은 a=3이고 조건문은 a가 2인지 판별하는 조건문이었기 때문에 False인 상황을 다룬 코드였습니다. 만약 True값이 반환되는 상황이라면, AssertionError가 발생하지 않아 뒤에 있는 print("True") 구문이 정상적으로 실행되어 결과값은 "True"가 됩니다.
assert는 Try~except 구문으로 예외처리를 해주는 것과 비슷합니다. 하지만, assert는 단순 에러 찾기 보다는 값을 보증하기 위해 사용됩니다. 어떤 함수의 반환값이나 함수의 입력값, 또는 변수값이 어떤 조건이나 영역에서 참임을 보증하기 위해 사용합니다. 이에 반해, Try~except는 보증보다 예외처리 구문으로써 파이썬에 기본적으로 정의되어 있는 에러가 발생했을 때 어떻게 대처할 지에 대해 집중합니다.
정리하자면 assert가 들어가는 가정 설정문(assertion)은 사전 조건, 사후 조건, 불변식 등으로 대체적으로 이뤄져있습니다.
- 함수의 시작점에서 참이여야하는 경우 => 사전 조건
- 함수가 끝날 때 참인 것을 보증하는 경우 => 사후 조건
- e.g. 게산 결과가 올바르지 않은 경우
- 부분 코드 내부에서 특정 지점에서 참인 것을 보증하는 경우 => 불변식
assert는 개발자가 오류 상황을 직접 정의해서 해당 코드가 조건문을 통해 정의된 사용자 정의 에러를 발생하지 않도록 보증해줍니다. 해당 조건문을 만족하지 못 할 때, AssertionError에 해당하는 예외를 일으킵니다. "일으킵니다"에서 보면 이러한 예외를 일으키는 것에는 raise가 있습니다. raise는 오류를 이미 발견한 상황에서 예외를 발생시키기 위한 명령입니다.
# raise [예외클래스]([메시지])
bottom = 0
div_num = 9/buttom
if bottom == 0:
raise ZeroDivisionError("0으로 나눌 수 없습니다.")
raise와 assert의 차이는 기능은 비슷하지만 쓰임새가 다릅니다. raise는 이미 확인된 에러 케이스가 서비스에서 나타날 때 확인할 수 있도록 사용되고, assert는 시험이나 디버깅의 상황에서 주로 사용됩니다.