Python을 정적 타입 언어처럼 사용하기
Python에서 변수 타입을 고정하고 엄격하게 사용하는 방법
정적 타입 언어와 동적 타입 언어¶
프로그래밍 언어는 변수의 타입이 정해지는 시점에 따라 정적 타입 언어와 동적 타입 언어로 나누어진다.
정적 타입(Statically Typed) 언어는 컴파일 시점에 변수의 타입이 결정되는 언어로, 이를 위해 코드에 미리 데이터의 자료형을 지정해줘야 한다. 타입 에러로 인한 문제를 컴파일 타임에 해결할 수 있기 때문에 안정성이 높고, 컴파일 시에 미리 타입을 결정하기 때문에 실행속도가 빠르지만, 프로그래밍의 유연성이 낮다. C, C++, Java 등이 대표적인 정적 타입 언어들이다.
동적 타입(Dynamically Typed) 언어는 런타임 시점에 변수의 타입이 결정되는 언어로, 따라서 코드에 미리 데이터의 자료형을 지정해줄 필요가 없다. 코딩 시 타입에 대한 제한이 없기 때문에 유연성이 높아 생산성이 좋지만, 런타임 단계에서 데이터의 자료형으로 인한 오류가 발생할 수 있다. Python, Ruby, JavaScript 등이 대표적인 동적 타입 언어들이다.
Python에서 정적 타입 사용하기¶
사용 방법¶
아래와 같이 Python 3.5 부터 추가된 타입 힌트를 사용하면 변수에 자료형에 대한 지침을 부여할 수 있다.
아래와 같이 함수나 클래스의 파라미터에 타입 힌트를 적용할 수 있다.
아래와 같이 타입의 별칭을 만들 수 있다.
위에서 볼 수 있듯이 |
를 사용해서 둘 이상의 타입을 조합한 Union 타입이나 None
을 조합한 Optional 타입을 만들 수 있다.
특정 목록 중 하나로 한정하고 싶을 경우 아래와 같이 Literal
객체를 사용하면 된다.
특정 변수의 값을 고정하고 싶을 때는 아래와 같이 Final
객체를 사용하면 된다.
검사 방법¶
Mypy 사용¶
Mypy와 Variable Annotations을 사용하면 정적 타입 언어처럼 미리 타입 에러를 체크해볼 수 있다.
Mypy는 아래와 같이 pip을 통해서 설치할 수 있다.
아래와 같이 짧은 코드를 작성하고 test.py
로 저장한 후
mypy
를 통해서 파일을 시행하면,
test.py:1: error: Incompatible types in assignment (expression has type "str", variable has type "int")
Found 1 error in 1 file (checked 1 source file)
이렇게 타입 에러를 검사해준다. 참고로 Python의 Annotations은 Comment와 마찬가지로 강제성이 전혀 없기 때문에 실행 시에 Annotations을 작성해주는 것 자체로는 런타임 시에 에러가 나지는 않는다.
Info
참고로 Variable Annotations는 Python 3.6 부터 도입된 일종의 주석 기능으로, PEP 526에서 세부 내용을 확인할 수 있다.
IDE 기능 사용¶
VS Code에서 Python 스크립트를 코딩할 때 사용하는 extension 중 Pylance가 있다. Pylance의 Type Checking Mode
옵션을 켜주면 아래 그림과 같이 데이터의 자료형을 검사해준다.
Annotation 무시하기¶
이런저런 이유로 Annotation을 무시하고 싶을 수도 있는데, 이 때는 아래와 같이 # type: ignore
주석을 해당 라인 뒤에 붙여주면 된다.