세 번째 방법은 타입 애너테이션(annotation)을 사용해서 get_winner에 전달되는 값이 딕셔너리와 비슷한 동작을 하는 MutableMapping 인스턴스가 아니라 dict 인스턴스가 되도록 강제하는 것이다(Better way 90: ‘typing과 정적 분석을 통해 버그를 없애라’ 참고). 다음 코드는 앞의 코드에 타입 애너테이션을 붙이고 mypy 도구를 엄격한 모드로 사용한다.

    from typing import Dict, MutableMapping
    
    def populate_ranks(votes: Dict[str, int],
                       ranks: Dict[str, int]) -> None:
        names = list(votes.keys())
        names.sort(key=votes.get, reverse=True)
        for i, name in enumerate(names, 1):
            ranks[name] = i
            
    def get_winner(ranks: Dict[str, int]) -> str:
        return next(iter(ranks))
        
    class SortedDict(MutableMapping[str, int]):
        ...
        
    votes = {
        'otter': 1281,
        'polar bear': 587,
        'fox': 863,
    }
    
    sorted_ranks = SortedDict()
    populate_ranks(votes, sorted_ranks)
    print(sorted_ranks.data)
    winner = get_winner(sorted_ranks)
    print(winner)
    
    $ python3 -m mypy --strict example.py
    .../example.py:48: error: Argument 2 to "populate_ranks" has incompatible type "SortedDict"; expected "Dict[str, int]"
    .../example.py:50: error: Argument 1 to "get_winner" has incompatible type "SortedDict"; expected "Dict[str, int]"
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.