점진적 타이핑

in python

from typing import List

def foobar(x: int) -> List[int]:
    r: List[int] = []
    r = list(range(int))
    
    return r

Why static typing?

정적 타입 시스템을 도입했더라면 Github에 공개적으로 올라온 코드의 버그중 최소 15%는 커밋조차 되지 못하고 잡혔을 것이다​​.

 To Type or Not to Type: Quantifying Detectable Bugs in JavaScript

Without type annotations, basic reasoning such as figuring out the valid arguments to a function, or the possible return value types, becomes a hard problem.

— Our journey to type checking 4 million lines of Python

 

타입 시스템 사용의 장점

  • 버그의 빠른 발견
    • 타입 체커와 같이 사용시 올바르지 않은 타입의 사용을 조기에 검증함
  • IDE 성능 향상
    • 타입 추론이 더 간단해지고 intellisense의 정확도가 올라감.
  • 조금더 나은 코드의 작성을 도움
    • 덕타이핑, 혼란스러운 리턴 타입의 사용을 지양하게 됨
    • 가독성 향상(뇌내 컴파일 X) + 타입힌트 자체로 독스 역할
  • 일종의 테스트 역할 수행

물론 단점도...

  • 시작의 지연
    • typing 모듈 임포트 시간
  • >>>개발자 노가다 필요<<<
  • 예전 버전 파이썬에서는 좀...

그래도 시도하는건 어렵지 않다

Why?

점진적 타이핑 지원

  • ❌ All-or-Nothing

  • 모든 부분에 타입을 적지 않아도 됨(Any 허용)

  • 타입을 적은 부분만 검사됨

HowTo

MyPy와 함께

  • stubgen을 사용해 일단 Any가 사용된 pyi 스텁 생성
    • 기존에 타입 어노테이션이 있었다면 반영됨
  • 외부 라이브러리의 타입 스텁이 필요하다면 python/typeshed 를 사용(TS의 definitelytyped 같은)
  • 점진적으로 타입을 명시해 나가기
  • 처음에는 mypy 설정을 여유롭게, 시간이 지날수록 철저하게
    • --strict

MyPy자체도 점진적으로 가는 방식을 권장

Demo

Gradual typing

By Seonghyeon Kim

Gradual typing

  • 783