더북(TheBook)

BETTER WAY 18 __missing__을 사용해 키에 따라 다른 디폴트 값을 생성하는 방법을 알아두라

내장 dict 타입의 setdefault 메서드는 키가 없는 경우를 짧은 코드로 처리할 수 있게 해준다(Better way 16: ‘in을 사용하고 딕셔너리 키가 없을 때 KeyError를 처리하기보다는 get을 사용하라’ 참고). 그중 대부분은 collections 내장 모듈에 있는 defaultdict 타입이 필요한 처리를 더 잘해준다(Better way 17: ‘내부 상태에서 원소가 없는 경우를 처리할 때는 setdefault보다 defaultdict를 사용하라’ 참고). 하지만 setdefaultdefaultdict 모두 사용하기가 적당하지 않은 경우도 있다.

예를 들어 파일 시스템에 있는 SNS 프로필 사진을 관리하는 프로그램을 작성한다고 가정하자. 필요할 때 파일을 읽고 쓰기 위해 프로필 사진의 경로와 열린 파일 핸들을 연관시켜주는 딕셔너리가 필요하다. 다음 코드에서는 일반 dict 인스턴스를 사용하고 get 메서드와 대입식(파이썬 3.8에 도입됐다. Better way 10: ‘대입식을 사용해 반복을 피하라’ 참고)을 통해 키가 딕셔너리에 있는지 검사한다.

pictures = {}
path = 'profile_1234.png'

if (handle := pictures.get(path)) is None:
    try:
        handle = open(path, 'a+b')
    except OSError:
        print(f'경로를 열 수 없습니다: {path}')
        raise
    else:
        pictures[path] = handle

handle.seek(0)
image_data = handle.read()
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.