하지만 여러분이 딕셔너리를 처리할 때는 앞에서 설명한 삽입 순서 관련 동작이 항상 성립한다고 가정해서는 안 된다. 파이썬에서는 프로그래머가 list, dict 등의 표준 프로토콜(protocol)을 흉내 내는 커스텀 컨테이너 타입을 쉽게 정의할 수 있다(Better way 43: ‘커스텀 컨테이너 타입은 collections.abc를 상속하라’ 참고). 파이썬은 정적 타입 지정 언어가 아니기 때문에 대부분의 경우 코드는 엄격한 클래스 계층보다는 객체의 동작이 객체의 실질적인 타입을 결정하는 덕 타이핑6에 의존하며, 이로 인해 가끔 어려운 함정에 빠질 수 있다.
예를 들어 가장 귀여운 아기 동물을 뽑는 콘테스트의 결과를 보여주는 프로그램을 작성한다고 하자. 여기에 각 동물의 득표수를 저장하는 딕셔너리가 있다.
votes = { 'otter': 1281, 'polar bear': 587, 'fox': 863, }
득표 데이터를 처리하고 각 동물의 이름과 순위를 빈 딕셔너리에 저장하는 함수를 정의하자. 이런 딕셔너리는 UI 요소에 표시할 내용을 제공하는 데이터 모델이 될 수 있다.
def populate_ranks(votes, ranks): names = list(votes.keys()) names.sort(key=votes.get, reverse=True) for i, name in enumerate(names, 1): ranks[name] = i
6 역주 “어떤 존재가 오리처럼 꽥꽥 소리를 내고, 오리처럼 보인다면 그것은 오리다”라는 말로 흔히 설명되는 덕타이핑(duck typing)은 동적 타입 지정의 일종으로, 객체가 실행 시점에 어떻게 행동하는지를 기준으로 객체의 타입을 판단하는 타입 지정 방식이다. 하지만 실제 행동을 모두 검증하기는 어려우므로 실제로는 객체가 제공하는 외부 인터페이스인 메서드와 애트리뷰트가 동일한지에 따라 타입이 같은지 결정한다. 실질적으로 이 말은 아무런 타이핑을 하지 않고 런타임에 객체가 제공하는 애트리뷰트와 메서드가 없는 경우에는 그냥 오류를 내겠다는 말과 같다.