승상의 코딩 블로그

파이썬 - Type Hint(or Type Annotation) 를 사용하는 이유 본문

Python (파이썬)

파이썬 - Type Hint(or Type Annotation) 를 사용하는 이유

양승상 2022. 12. 25. 17:05

python3.5 이상부터 타입힌트를 사용할 수 있다.

각 파이썬 버전마다 타입힌트를 지원하는 범위가 조금씩 다르기도 하다. 그러나 많은 차이가 있지는 않다.

 

프로그래밍 언어에는 C, C++ 처럼 각 변수 등의 타입을 지정해주는 정적 타입 언어가 있다.

Python 은 C,C++ 과 달리 동적 타입 언어이다.

즉, 파이썬은 코드에서 직접 타입을 지정하지 않는다. 코드가 실행될 때 파이썬이 알아서 타입(ex. integer, string, ...)을 추론한다.

 

파이썬처럼 타입을 추론해주면, 개발자는 더 편하고 빠르게 개발가능할 것이라고 생각할 수 있다.

또한, 덕타이핑을 통해 다형성을 유연하게 적용할 수도 있을 것이다. (잘 모르시겠다면, 타입을 직접 정해주지 않기 때문에(사용가능한 범위를 제한함) 사용가능한 범위가 넓어졌다 정도로 생각해주세요.)

 

그러나 장점만 있지는 않다. C, C++ 은 타입을 미리 정의해줌으로써, 코드가 직접실행되는 시기가 아니라 컴파일 단계에서부터 에러가 일어날 부분을 어느정도 파악할 수 있다. 

TypeHint 를 사용하지 않을 때 일어나는 일반적인 문제 예시

def sum(a, b):
	return a + b
    
print(sum(1,2)) # 3

 

두 수를 받아 더하는 sum 이라는 함수는 파라미터로 a(Integer), b(Integer) 를 받아 a+b(Integer) 를 반환한다.

코드를 작성할 때는 Integer를 받아 Integer를 반환함을 알고 있을 것이다.

그러나 코드를 유지보수하면서 몇 달 뒤 이 코드를 보게 되면 코드를 까먹게 된다. 

즉, Integer를 받아 Integer 를 반환한다는 것은 함수 안을 읽어보아야 알 수 있다. (코드가 간단하지 않다면 엄청난 시간이 걸릴 것이다.)

나뿐만 아니라 내가 작성한 코드를 사용하는 다른 개발자도 함수 내용을 읽어봐야 이 코드를 사용법을 파악할 수 있을 것이다.

 

만약, 코드의 사용법을 잘못 이해한다면 아래와 같이 의도와 다르게 사용될 수 있다.

def sum(a, b):
	return a + b
    
print(sum('1', '2')) # '12'

이 때 중요한 것은 잘못 사용했지만 에러가 발생하지 않는다는 것이다.

sum 함수에서 에러가 발생하지 않기 때문에, 에러를 찾는데 많은 시간이 소요된다.

 

이러한 잘못된 사용을 막기 위해, 문서화 등의 다양한 방법이 있다.

그러나 TypeHint 를 사용하는 것이 효율적일 때도 많으므로, TypeHint 의 장점에 대해 알아보면서 자세히 알아보자.

TypeHint(타입힌트)의 장점

타입힌트의 장점을 잘 살리기 위해서는 IDE(ex. VSCode) 의 설정도 중요하다.

이 글에서는 VSCode 를 사용하였고, Pylance 를 설치하였다. 그리고 Pylance 의 타입체크 기능을 활용하기 위해 Pylance 의 설정(타입 체크 기능을 off 에서 basic 으로 설정함)을 수정하였다.

 

1. 짧은 문서화가 가능하다.

  • 함수를 사용하기 위해, 제공할 입력과 결과에 대한 이해가 쉬워진다.
  • 만약, 타입힌트가 없다면 '개별 문서'나 '아래와 같이 doctring' 을 제공해줘야 할 것이다.
def sum(a, b): 
    """
    sum two parameters
    
    Args:
        param1 (int): The first parameter.
        param2 (str): The second parameter.

	Returns:
        int : sum of a and b
    """
	return a + b
  • docstring 을 제공하는 것도 좋은 방법 중 하나이지만, 주석이나 문서는 업데이트(코드와 일치화)하기 쉽지 않다.
    • 주석이나 docstring 은 실제 코드 동작에 영향을 주지 않기 때문임
  • 문서로 제공할 경우에는, 문서의 양이 많아질 수록 사용자가 읽기 힘들어진다.
  • TypeHint 는 함수의 첫줄에 매개변수 타입과 반환값을 표현하므로, 사용 시 쉽게 사용방법을 파악할 수 있다. (IDE 기능)

타입힌트가 없을 때와 있을 때의, 함수 사용시 설명 (VSCode 기능과 연동)

2. 코드 작성에 용이하다.

사용의도에 맞지 않을 경우 표시해 줌

타입힌트가 있으면, 내가 의도하는 상황과 다를 경우 붉은색 밑줄을 표시해줌 (VSCode 기능과 연동)

  • sum, sumWithTypeHint 모두 정수를 받아서 정수를 받환하도록 의도했다.
  • 타입힌트가 없는 sum 함수는 위의 "TypeHint 를 사용하지 않을 때 일어나는 일반적인 문제 예시" 에서 설명한 것처럼, 잘못사용될 수 있다.
  • 타입힌트가 있는 sumWithTypeHint 는 의도와 잘못사용될 경우, 붉은색 밑줄로 바로 표시가 된다. (IDE 기능)

커플링이 되는 부분이 표현되므로 리팩토링 등 코드를 수정하는 경우에 유용함

  • pandas 등과 같은 라이브러리는 DataFrame이라는 특정 데이터 구조를 가지고 있다.
  • 개발하다보면, pandas 라이브러리처럼 데이터 구조를 자체적으로 만들 때가 생긴다.
  • 추후에 이러한 데이터 구조를 변경하게 되면, 변경에 영향을 받는 부분을 쉽게 파악할 수 있다. (IDE 또는 mypy)

코드를 단순화 시킬 수 있음

  • TypeHint 가 없다면 아래와 같이 타입을 체크하는 로직이 추가해줘야 할 수 있다.

함수가 제대로 원하는 타입을 체크하는 로직을 추가됨

TypeHint(타입힌트)의 사용시 유의할 점 (MyPy)

타입힌트는 타입을 강제하지 않음. 코드 실행 시 에러를 발생시키지 않음.

타입힌트는 타입을 강제하지 않는다. 타입과 다르게 사용할 때 생기는 붉은 색밑줄 기능은 IDE 의 알림 기능이다.

즉, 타입힌트와 다르게 사용한다고 해도, 코드가 실행될 때 영향을 주지는 않는다. 

 

그래서 정의한 타입이 정상적으로 사용되는지는 mypy 모듈을 이용해서 아래와 추가로 체크한다.

sumWithTypeHint 는 test.py 내부 코드임. mypy 를 통해 타입체크를 할 수 있음.

 

 

 

코드가 단순하고 적은 양이라면, 크게 왜 쓰는지 와닿지 않을 수 있다.

그러나 코드를 오랫동안 유지보수해야하고, 로직이 복잡하고, 코드의 양이 많아진다면 코드의 일부에 타입힌트를 추가하는 것도 나쁘지 않다. 

어떤 것이든 장점만 있을 수 없다. 단점도 존재하기 마련이다. 나는 상황에 따라서 타입힌트를 쓰기도 하고, 쓰지 않기도 한다.

이에 대한 결정은 자신이 내려야한다. 많이 코드를 짜보면서 자신의 기준을 정하기를 바란다.

반응형
Comments