이제 add 구현이 더 짧고 간단해졌다. add 코드는 data 딕셔너리에 있는 키에 접근하면 항상 기존 set 인스턴스가 반환된다고 가정한다. add 메서드가 아주 많이 호출되면 집합 생성에 따른 비용도 커지는데, 이 구현에서 불필요한 set이 만들어지는 경우는 없다.
이와 유사한 경우에는 defaultdict를 사용하는 편이 setdefault를 사용하는 방법보다 더 낫다(Better way 37: ‘내장 타입을 여러 단계로 내포시키기보다는 클래스를 합성하라’ 참고). 여전히 defaultdict가 여러분의 문제를 해결해주지 못하는 경우도 있지만, 파이썬에는 이런 한계를 뛰어넘을 수 있는 다른 도구도 많다(Better way 18: ‘__missing__을 사용해 키에 따라 다른 디폴트 값을 생성하는 방법을 알아두라’, Better way 43: ‘커스텀 컨테이너 타입은 collections.abc를 상속하라’의 collections.Counter 내장 클래스 참고).
기억해야 할 내용
• 키로 어떤 값이 들어올지 모르는 딕셔너리를 관리해야 하는데 collections 내장 모듈에 있는 defaultdict 인스턴스가 여러분의 필요에 맞아떨어진다면 defaultdict를 사용하라.
• 임의의 키가 들어 있는 딕셔너리가 여러분에게 전달됐고 그 딕셔너리가 어떻게 생성됐는지 모르는 경우, 딕셔너리의 원소에 접근하려면 우선 get을 사용해야 한다. 하지만 setdefault가 더 짧은 코드를 만들어내는 몇 가지 경우에는 setdefault를 사용하는 것도 고려해볼 만하다.