딕셔너리 안에 나라 이름이 들어 있는지 여부와 관계없이 각 집합에 새 도시를 추가할 때 setdefault를 사용할 수 있다. 이 방법은 get 메서드와 대입식(파이썬 3.8부터 사용할 수 있음)을 사용하는 방식보다 코드가 훨씬 짧다.

    visits.setdefault('프랑스', set()).add('칸')    # 짧다
    
    if (japan := visits.get('일본')) is None:       # 길다
        visits['일본'] = japan = set()
    japan.add('교토')
    print(visits)
    
    >>>
    {'미국': {'로스엔젤레스', '뉴욕'}, '일본': {'하코네', '교토'}, '프랑스': {'칸'}}

    직접 딕셔너리 생성을 제어할 수 있다면 어떨까? 예를 들어 클래스 내부에서 상태를 유지하기 위해 딕셔너리 인스턴스를 사용할 때가 이런 경우에 해당한다. 다음 코드에서는 앞에서 본 예제를 클래스로 감싸서 딕셔너리에 저장된 동적인 내부 상태에 접근할 수 있는 도우미 메서드를 제공한다.

    class Visits:
        def __init__(self):
            self.data = {}
            
        def add(self, country, city):
            city_set = self.data.setdefault(country, set())
            city_set.add(city)
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.