새소식

ML Development/Python - 2022.06.07

[파이썬] static type checker

  • -

Type Hint(타입 힌트) 점검?

타입 힌트의 필요성을 느껴 사용했다면, 이제 힌트를 제대로 적었는지 확인해야 한다.

파이썬은 Dynamic typing(동적 타이핑) 언어라서, 잘못된 힌트를 적었더라도 실행엔 아무런 이상이 없다.

그래서 힌트가 제대로 됐는지 확인할 수가 없다.

 

파이썬에서 타입 힌트가 제대로 됐는지 확인하려면 별도의 Type Checker(타입 체커)를 사용해야 한다.

타입 체커는 mypy, pyright, pytype 등이 있는데 이 중에서 mypypyright가 많이 활용되고 있다.

https://star-history.com/

주의할 점

타입 힌트가 파이썬에 도입됐지만, 타입 체커가 아직 정식으로 지원되는 것은 아니라고 한다. 따라서 전체 프로그램 코드를 모두 확인하기 보다는, 확인이 필요한 함수나 클래스만 따로 떼어서 Unit 단위로 테스트하는 것이 좋다고 한다.

 

pyright

pyright는 다른 타입 체커 보다 훨씬 빠른 속도를 자랑한다.

또한 vscode의 pylance에 통합돼 있어 간편하게 사용할 수 있다는 장점이 있다.

물론 별도로 pip 패키지를 설치해서도 사용할 수 있다.

 

vscode를 활용한 사용법

pyright는 pylance에 통합돼 있다.

따라서 pylance를 설치한 뒤 vscode의 settings에서 python.analysis.typeCheckingModebasic 혹은 strict로 변경하면 된다. 참고로 basic과 strict 모드 차이는 다음과 같다. 

basic: Non-type checking-related rules (all rules in off) + basic type checking rules
strict: All type checking rules at the highest severity of error (includes all rules in off and basic categories)

 

pylance를 통해 pyright를 사용하면, 잘못된 타입 힌트에 대한 경고가 vscode의 problems 영역에 표시된다. 실제로 다음 코드에선 타입 힌트가 Union[str]로 돼 있지만, 실제로는 int 데이터도 있기 때문에 에러가 발생했다.

  • 혹시 안된다면 extentions중 python for vscode를 제거하면 된다. (아마도...)
from typing import Dict, Union

# test의 value가 int도 포함돼야 하지만 안 적혀 있음 -> type check 시 에러 발생
test: Dict[str, Union[str]] = {"hello": "world", "world": "wow!!", "hee": 17}

 

별도로 패키지 설치해서 사용하기

간단하게 pip install pyright를 사용해서 설치하면 된다.

사용은 pyright 파일명.py으로 굉장히 단순하다.

pip install pyright # 설치

pyright 파일명.py # pyright 실행

pyright 파일명.py && python 파일명.py # type check 이상 없을 시 파일 실행

 

mypy

mypy는 vscode의 linters에 통합돼 있다.

하지만 linter로는 좀 더 용도에 맞는 다른 것을 사용(flake8...)하고

mypy는 별도로 설치하는 것을 추천한다. 

 

별도로 패키지 설치해서 사용하기

python3 -m pip install mypy를 사용해서 설치하면 된다.

사용은mypy 파일명.py으로 굉장히 단순하다.

python3 -m pip install mypy # 설치

mypy 파일명.py # 실행

mypy 파일명.py && python 파일명.py # type check 이상 없을 시 파일 실행

type check 에러가 발생할 경우 다음과 같이 알려준다.

test.py:4: error: Dict entry 2 has incompatible type "str": "int"; expected "str": "str"
Found 1 error in 1 file (checked 1 source file)

참고

 

GitHub - microsoft/pyright: Static type checker for Python

Static type checker for Python. Contribute to microsoft/pyright development by creating an account on GitHub.

github.com

  • pyright의 깃허브 저장소이다.
 

Getting started - mypy 0.961 documentation

Previous Home

mypy.readthedocs.io

  • mypy의 Docs이다.
 

타입 파이썬! 올바른 class 사용법과 객체지향 프로그래밍 - 인프런 | 강의

Python으로 생산성있는 개발만 아니라 견고하고 안전하게, 그리고 확장성있는 개발을 하세요! 🔥, - 강의 소개 | 인프런

www.inflearn.com

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.