더북(TheBook)

이제 add 구현이 더 짧고 간단해졌다. add 코드는 data 딕셔너리에 있는 키에 접근하면 항상 기존 set 인스턴스가 반환된다고 가정한다. add 메서드가 아주 많이 호출되면 집합 생성에 따른 비용도 비싸지는데, 이 구현에서 불필요한 set이 만들어지는 경우는 없다.

이와 유사한 경우에는 setdefault를 사용하는 것보다 defaultdict를 사용하는 편이 더 낫다(아이템 29 “딕셔너리, 리스트, 튜플을 깊게 중첩시키기보다는 클래스를 합성하라” 참조). defaultdict가 문제를 해결해주지 못하는 경우가 여전히 있지만, 파이썬에는 이런 한계를 뛰어 넘을 수 있는 다른 도구가 마련되어 있다(아이템 28 “__missing__을 사용해 키에 따라 다른 디폴트 값을 생성하는 방법을 알아두라”, 아이템 57 “커스텀 컨테이너 타입은 collections.abc를 상속하라”의 collections.Counter 내장 클래스 참조).

 

기억해야 할 내용

• 키로 임의의 집합에 속한 값들이 들어오는 딕셔너리를 관리해야 하는데, collections 내장 모듈에 있는 defaultdict 인스턴스가 해당 문제에 적합하다면 defaultdict를 사용하라.

• 임의의 키가 들어 있는 딕셔너리가 전달됐고 그 딕셔너리가 어떻게 생성됐는지 모르는 경우, 딕셔너리의 원소에 접근하기 위해서는 우선 get을 사용해야 한다. 하지만 setdefault 메서드가 코드를 줄일 수 있고 디폴트 객체 할당 비용이 낮은 몇 가지 경우에는 setdefault 사용도 고려해볼 만하다.