가정 설정문
assert
assert 설명
assert
는 뒤의 조건이 True
가 아니면 AssertError
를 발생시킴
>>> a = 3
>>> assert a == 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
- 예외를 발생시키는 예외 처리와 비슷
- 하지만 예외 처리는 에러가 발생 했을 때 어떤 처리를 하기 위한 코드이고, 가정 설정문(
assert
)은 어떤 조건이 True
임을 보증하기 위해서 사용
- 오류를 발생시키는
raise
와 비슷하지만 다름
raise
는 오류가 발생 했을 때 "except
와 함께 이렇게 처리해라"는 뜻이라면, assert
는 "조건이 참일 때 코드를 보장하며 이 조건은 올바르다"는 뜻
- 하지만 이 조건이 거짓이라는 것은 내가 보증하지 않은 동작이니
AssertionError
를 발생해라는 식의 흐름
- 왜
assert
가 필요한 것일까?
- 예를 들어, 어떤 함수는 성능을 높이기 위해 반드시 정수만을 입력받아 처리하도록 만들 수 있음
- 이런 함수를 만들기 위해서는 반드시 함수에 정수만 들어오는지 확인할 필요 있음
- 이를 위해
if문
을 사용할 수도 있고 예외 처리
를 사용할 수도 있지만 가정 설정문
을 사용하는 방법도 있음
lists = [1, 3, 6, 3, 8, 7, 13, 23, 13, 2, 3.14, 2, 3, 7]
def test(t):
assert type(t) is int, '정수 아닌 값이 있네'
for i in lists:
test(i)
AssertionError: 정수 아닌 값이 있네
lists
에 실수가 하나 있으므로 AssertionError
가 발생
assert
문은 다음 형식으로 작동
assert [조건], [메시지]
- [메시지]는 생략할 수 있다.
assert
는 개발자가 프로그램을 만드는 과정에 관여
- 원하는 조건의 변수 값을 보증 받을 때까지
assert
로 테스트 할 수 있음
- 이는 단순히 에러를 찾는 것이 아니라 값을 보증하기 위해 사용됨
- 예를 들어 함수의 입력 값이 어떤 조건의 참임을 보증하기 위해 사용할 수 있고 함수의 반환 값이 어떤 조건에 만족하도록 만들 수 있음
- 혹은 변수 값이 변하는 과정에서 특정 부분은 반드시 어떤 영역에 속하는 것을 보증하기 위해 가정 설정문을 통해 확인 할 수도 있음
- 이처럼 실수를 가정해 값을 보증하는 방식으로 코딩 하기 때문에 이를 '방어적 프로그래밍'이라 부름