더북(TheBook)

이 코드는 문제가 많다. 파일 핸들을 만드는 내장 함수인 open이 딕셔너리에 경로가 있는지 여부와 관계없이 항상 호출된다. 이로 인해 같은 프로그램상에 존재하던 열린 파일 핸들과 혼동될 수 있는 새로운 파일 핸들이 생길 수도 있다. open이 예외를 던질 수 있으므로 이 예외를 처리해야 한다. 하지만 이 예외를 같은 줄에 있는 setdefault가 던지는 예외와 구분하지 못할 수도 있다(딕셔너리와 비슷한 구현을 사용하면 이런 예외가 발생할 수 있다. Better way 43: ‘커스텀 컨테이너 타입은 collections.abc를 상속하라’ 참고).

내부 상태를 관리하려 한다면 프로필 사진의 상태를 관리하기 위해 defaultdict를 쓸 수 있다고 가정할 수도 있다. 다음 코드는 이전 예제와 똑같은 로직을 도우미 함수와 defaultdict 클래스를 사용해 작성한 것이다.

from collections import defaultdict

def open_picture(profile_path):
    try:
        return open(profile_path, 'a+b')
    except OSError:
        print(f'경로를 열 수 없습니다: {profile_path}')
        raise
        
pictures = defaultdict(open_picture)
handle = pictures[path]
handle.seek(0)
image_data = handle.read()

>>>
Traceback ...
TypeError: open_picture() missing 1 required positional
argument: 'profile_path'
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.