오늘 할 일: 끝내주게 숨쉬기

깃허브에 공개된 오픈소스를 보다보면 종종 assert를 정의하는 부분이 있더라구요. 어떤 목적으로 사용되는지 궁금해서 서치를 갈겨봤습니다.

 

assertion [əˈsɜːrʃn] 
명사
1. (사실임을) 주장claim
He was correct in his assertion that the minister had been lying. 그 장관이 거짓말을 하고 있었던 것이라는 그의 주장은 옳았다.
2. (권리 등의) 행사
the assertion of his authority 그의 권위 행사

 

assert는 조건이 True가 아니면 AssertError를 발생시킵니다. assert가 없으면 그냥 False라고 나타날 뿐이죠.

a = 3
assert a == 2
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-9-6f4588b9ab46> in <module>
      1 a=3
----> 2 assert a==2

AssertionError:

 

왜 굳이 assert를 사용할까요? assert가 필요한 이유는 함수의 입력 또는 출력의 타입을 보장하기 위해서 입니다. 

예를 들어 입력값에 로그함수를 적용한다고 합시다. 이 함수는 입력값으로 반드시 0을 초과하는 값만을 받도록 정의할 필요가 있습니다. 이런 함수를 만들 때에는 입력값이 0 이하인 값을 포함하는지 아닌지를 확인을 해야겠죠. 이를 위해 if문을 사용할 수도 있고 '예외 처리'를 사용할 수도 있지만, '가정 설정문'을 사용하는 방법도 존재합니다. 아래 사용 예시를 살펴보겠습니다.

 

아래 코드는 함수 인자가 양수인지 확인하는 코드입니다.

lists = [1, 2, 3.6, 7, -1, 10, 15]

def test(num):
    assert num > 0, '0 이하의 값이 존재합니다'

for num in lists:
    test(num)
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-18-3fa8743a37e5> in <module>
      1 for num in lists:
----> 2     test(num)

<ipython-input-17-341bd8694eda> in test(num)
      2 
      3 def test(num):
----> 4     assert num > 0, '0 이하의 값이 존재합니다'

AssertionError: 0 이하의 값이 존재합니다

 

lists에 조건 'num > 0'을 만족하지 않는 음수값이 하나 있으므로 AssertionError가 발생했습니다.

assert 문은 아래와 같은 형식으로 작성하며, '에러 메시지'는 생략할 수 있습니다.

assert 보장할 조건, '에러 메시지'

 

assert는 프로그램 과정에 포함되어 값이 원하는 조건을 만족한다고 보증받을 때까지 assert로 테스트 할 수 있습니다. 단순히 에러를 찾는 것이 아니라 값을 보증하기 위해 사용된다고 이해하면 될 것 같습니다.

 

예를 들어, 머신러닝 파이프라인 중 Assert는 아래와 같은 경우에 사용할 수 있겠습니다.

  • 입력값이 어떤 조건을 만족하는지 확인하기 위해
    • ex) 연속형인 경우 값이 정수만을 포함하는지, 범주형인 경우 미리 설정한 범주값들만을 포함하는지 등
  • 피처 엔지니어링과 같은 변환 과정에서 결과값이 특정 조건을 만족하는지 확인하기 위해
  • 함수의 결과가 특정 조건을 만족하는지 확인하기 위해

 

 

이처럼 실수(float X, mistake O)를 가정해 값을 보증하는 방식으로 코딩하기 때문에 이를 '방어적 프로그래밍(Defensive programming)'이라 부른다고 합니다.

 

 

참고

https://wikidocs.net/21050

 

03_가정 설정문(assert)

assert는 뒤의 조건이 True가 아니면 AssertError를 발생한다. ``` >>> a = 3 >>> assert a == 2 #결과 Traceback (mos ...

wikidocs.net