typing과 정적 분석을 통해서 버그를 없애라

매일 공부(ML)·2022년 10월 25일
0

파이썬 코딩의 기술

목록 보기
27/27

typing과 정적 분석을 통해서 버그를 없애라

문서는 API 사용자가 API를 제대로 사용하는 방법을 알려주는 훌륭한 방법이다. 그러나, 문서로 부족한 경우도 있고 잘못 사용 시 버그가 생긴다.

여러분의 코드가 하위 의존 관계를 올바른 방법으로 활용하는지 검사하는 매커니즘이 있어야한다.

사실 파이썬은 동적 기능에만 맞춰있기에 컴파일 시점의 타입 안전성을 전혀 제공하지 않았다.


타입 힌트(type hint)를 사용하면 타입이 필요할 때마다 코드베이스를 점진적으로 변경하는 점진적 타입 지정이 가능하고, 타입 애너테이션을 파이썬 프로그램에 추가 시 정적 분석 도구로 프로그램 소스 코드를 검사해서 버그가 생길 가능성이 높은 부분을 식별할 수 있는 장점이 있다.

물론, typing 내장 모듈은 실제 그 자체로는 어떠한 타입 검사 기능도 제공하지 않고 제너릭스(여러 타입에 대해서 작동할 수 있는 일반적인 코드를 작성할 수 있게 해주는 기능)를 포함한 타입을 정의할 때 사용하는 공통 라이브러리 제공한다.


파이썬 코딩의 기술 책에서 typing 예제에선 mypy에 --strict 플래그를 사용하여 지원하는 여러 가지 경고를 모두 사용할 수 있다.

$ python3 -m mypy --strict example.py

프로그램을 실행하기 전에 수많은 일반적인 오류를 감지하고 정적 분석은 좋은 단위 테스트에 안정성 계층을 추가한다.

def subtract(a,b):
	return a - b
subtract(10, '5')

>>>
Traceback...
TypeError: unsupported operand type(s) for -: 'int' and 'str'
"""
파라미터와 변수 타입 애너테이션 사이는 콜론으로 구분하기에 반환 값 타입은 함수 인자 목록 뒤에 -> 타입 형태 지정
이런 타입 애너테이션과 mypy를 사용하면 쉽게 버그를 찾을 수 있다.
"""

def subtract(a: int, b: int) ->int: #함수에 애너테이션을 붙인다.
	return a-b
    
subtract(10, '5') # 아이고 문자열 값을 넘김

$ python3 -m mypy --strict example.py
.../example.py:4: error: Argument 2 to "subtract" has incompatible type "str"; expected "int"
class Counter:
	def __init__(self) -> None:
    	self.value: int = 0 #필드/변수 애너테이션
        
    def add(self, offset: int) -> None:
    	value += offset #아이고! 'self.'를 안 씀
        
    def get(self) -> int:
    	self.value #아이고! 'return'을 안 씀
        
counter = Counter()
counter.add(5)
counter.add(3)
assert counter.get() == 8

>>>
$ python3 -m mypy --strict example.py
.../example.py:6 error: Name 'value' is not defined
.../example.py:8 error: Missing return statement

Summary

  • 파이썬은 변수, 필드, 함수, 메서드에 타입 정보를 추가할 수 있게 특별한 구문과 typing 내장 모듈을 제공한다.

  • 정적인 타입 검사기를 사용하면 타입 정보를 활용해서 런타임에 발생할 수 있는 다양한 일반적인 오류를 방지할 수 있다.

  • 타입을 프로그램에 도입하고, API에 타입을 적용하고, 타입 정보를 추가해도 생산성이 떨어지지 않도록 해주는 다양한 모범 사례가 있다.

profile
성장을 도울 아카이빙 블로그

0개의 댓글