Python Assert 문을 사용한 효과적인 디버깅

당신은 프로그래머입니까? 그렇다면 디버깅은 코딩하는 언어에 관계없이 필수 기술입니다. 이 기사에서는 효과적인 디버깅을 위해 Python에서 assert 문을 사용하는 방법을 배웁니다.

프로젝트에서 작업할 때 여러 모듈을 정의합니다. 여기에는 함수, 클래스 정의 등이 포함됩니다. 또한 구현의 버그로 인해 오류나 예기치 않은 결과가 발생할 수 있습니다. Assert 문은 이러한 코드를 디버깅하는 데 유용합니다.

이 자습서에서는 assert 문을 사용하는 구문과 작동하는 코드 예제를 배웁니다. 또한 어설션 오류가 무엇인지, 그리고 이를 사용하여 개발 중에 코드의 오류를 수정하는 방법도 알아봅니다.

의 시작하자!

Python에서 Assert 문을 사용하는 방법

assert 문을 사용하는 구문을 배운 다음 몇 가지 예제 코딩을 진행합니다.

Assert 문의 구문

Python에서 assert 문을 사용하는 구문부터 시작하겠습니다.

assert expression, message

여기,

  • expression은 평가할 유효한 Python 표현식입니다. 이는 변수 값, 변수의 참 값, 함수의 반환 값 등에 대한 조건이 될 수 있습니다.
  • 표현식이 True로 평가되는 한 assert 문은 오류를 발생시키거나 아무 것도 반환하지 않습니다. 이는 프로그램이 예상대로 작동함을 나타냅니다.
  • 표현식이 더 이상 True가 아니면 AssertionError 예외가 발생합니다.
  • 메시지는 선택적 문자열입니다. AssertionError 예외가 발생할 때마다 역 추적에 표시되는 메시지를 지정할 수 있습니다.

다음으로 assert 문이 더 깨끗하고 버그 없는 코드를 작성하는 데 도움이 되는 몇 가지 예를 코딩해 보겠습니다.

이 GitHub gist에서 이 자습서에 사용된 코드 예제를 찾을 수 있습니다.

Python의 Assert 문 예제

다음 예를 고려하십시오. 코드에 할인 변수가 있다고 가정합니다. 그러나 그 값이 항상 max_discount보다 작거나 같기를 원할 것입니다.

실수로 할인 변수를 값으로 설정하지 않았는지 확인하기 위해 어설션을 추가할 수 있습니다. 평가할 표현식은 discount <= max_discount입니다.

>>> max_discount = 50
>>> discount = 20
>>> assert discount <= max_discount

여기서 할인(20)은 max_discount(50)보다 작습니다. 따라서 assert 문은 오류를 발생시키지 않습니다.

AssertionError 예외

할인 변수가 max_discount보다 큰 값으로 설정되면 AssertionError 예외가 발생합니다.

>>> discount = 75
>>> assert discount <= max_discount
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

우리는 assert 문을 통해 선택적 메시지 문자열을 지정할 수도 있다는 것을 알고 있습니다.

더 자세한 진단 정보를 제공하는 메시지 문자열도 사용하겠습니다. assert 문에 discount 및 max_discount 값도 포함하는 Python f-string을 추가해 보겠습니다.

>>> assert discount <= max_discount, f"discount should be at most {max_discount}; got discount = {discount}"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: discount should be at most 50; got discount = 75

위의 출력 셀에서 볼 수 있듯이 AssertionError 예외에는 이제 discount 및 max_discount 변수의 값이 포함됩니다.

Assert로 Python 함수 디버깅 및 테스트

함수를 정의할 때 의도치 않게 함수가 의도한 대로 작동하지 못하게 하는 버그(논리적 오류)를 도입할 수 있습니다.

예를 들어 보겠습니다. 수업 중에 시험이 있고 학생들에게 보너스 질문을 시도할 기회가 주어진다고 가정합니다. 보너스 질문을 시도하는 학생은 시험에서 10점을 추가로 받습니다. 😄

다음 함수 get_final_score를 고려하십시오.

  • 현재 점수, 점수 및 부울 보너스를 받습니다.
  • 학생이 보너스 질문에 답한 경우 부울 보너스는 True이며 현재 점수보다 10점을 더 받습니다.
  • 그런 다음 함수는 최종 점수를 반환합니다.
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

함수를 몇 번 호출해 보겠습니다. 보너스가 참과 거짓으로 설정된 점수가 34와 40인 경우 최종 점수는 각각 44와 40입니다.

print(get_final_score(34,True))
# 44
print(get_final_score(40,False))
# 40

그러나 시험의 최대 점수는 50점입니다. 따라서 학생이 49점을 받고 보너스 질문에도 답했다면 get_final_score 함수는 행복하게 최종 점수를 59로 계산합니다.

print(get_final_score(49,True))
# 59

기술적으로는 가능합니다. 그러나 학생이 시험에서 얻을 수 있는 최대 점수보다 더 많은 점수를 얻을 수 없다고 가정해 봅시다. 🙂

이제 max_score 변수를 초기화하겠습니다. 그리고 final_score 변수의 함수에서 반환된 점수를 캡처합니다.

그런 다음 final_score가 max_score보다 작은지 확인하는 어설션을 추가합니다.

def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

final_score = get_final_score(47,True)
max_score = 50

assert final_score <= max_score

이제 함수 호출 get_final_score(47,True)에 대해 AssertionError 예외가 발생합니다.

Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score
AssertionError

이제 설명하는 f-문자열을 Python assert 문에 추가합니다.

assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
AssertionError: final_score should be at most 50; got 57

기능 수정

돌아가서 get_final_score 함수의 정의를 수정하여 예기치 않은 동작을 수정해 보겠습니다.

  • get_final_score 함수는 max_score도 매개변수로 사용합니다.
  • 보너스가 True인지 확인합니다. 참이면 점수 변수에 10점을 추가합니다.
  • 그런 다음 점수가 max_score보다 큰지 확인합니다. 그렇다면 max_score를 반환합니다.
  • 그렇지 않으면 점수를 반환합니다.

이제 최종 점수가 항상 max_score보다 작거나 같도록 했습니다.

def get_final_score(score,bonus,max_score):
    if bonus:
        score += 10
    if score > max_score:
        return max_score
    return score

빠른 연습으로 함수가 이제 예상대로 작동하는지 확인하는 몇 가지 어설션을 작성합니다.

AssertionError 예외에 대한 참고 사항

표현식이 False로 평가되면 AssertionError 예외가 발생하지만 이러한 오류를 예외로 처리하지 않도록 주의해야 합니다. 다음과 같은 작업을 수행해서는 안 된다는 의미입니다.

try:
    <doing this>
except AssertionError:
    <do this>

get_final_score에 대한 이전 예제에서는 어설션을 사용하여 final_score가 max_score보다 작은지 확인했습니다. 그런 다음 어설션 오류가 없도록 함수 정의를 수정했습니다.

그것이 어설션의 목적입니다. 코드에 대한 온전성 검사이며 더 깨끗한 코드를 작성하는 데 도움이 됩니다. 반면 예외 처리는 런타임에 예기치 않은 오류를 예상하고 처리하는 것입니다. 여기에는 잘못된 입력 유형 및 값이 포함되는 경우가 많습니다.

요약하면 효과적인 디버깅을 위해 Python assert 문을 사용해야 하며 AssertionError를 예외로 처리해서는 안 됩니다.

결론

이 자습서는 Python에서 assert 문을 사용하는 방법을 이해하는 데 도움이 되었습니다. 학습한 내용을 요약하면 다음과 같습니다.

  • Python assert 문(assertions)은 assert expression 형식을 취합니다. 표현식이 True인지 확인합니다. True로 평가되지 않으면 AssertionError 예외가 발생합니다.
  • 구문 assert 표현식, 메시지와 함께 assert를 사용할 수도 있습니다. 이것은 AssertionError 예외가 발생할 때마다 메시지 문자열을 출력합니다.
  • 어설션 오류를 처리하기 위해 예외 처리를 구현하지 않는 것을 기억해야 합니다. 그리고 어설션을 코드의 온전성 검사를 위한 유용한 디버깅 도구로 사용하십시오.

개발자로서 어설션은 디버깅에 도움이 됩니다. 프로젝트의 모든 개별 구성 요소(모듈)가 예상대로 작동하는지 확인하기 위해 Python에서 단위 테스트를 작성하는 방법을 배울 수 있습니다.

다음으로 작업할 수 있는 초보자 Python 프로젝트 목록을 확인하세요.