날짜 구간에 값을 매핑하는 방법과 RangeKeyDict
·2019.12.16 12:00
RangeKeyDict를 쓰면 날짜 구간별 값을 if문 없이 깔끔하게 매핑할 수 있다.
특정 날짜에 따라 다른 값을 반환해야 하는 상황은 자주 나온다. 예시처럼 포인트 적립률이 2020년 1월 1일, 2월 2일, 8월 8일을 기준으로 바뀌는 경우를 if문으로 처리할 수는 있지만, 비교식이 길어지고 규칙을 바꾸기도 불편하다.
더 나은 방식은 날짜와 값을 쌍(pair) 으로 두고 순서대로 매칭하는 것이다. 적용 날짜를 내림차순으로 정해두면 로직은 단순해지지만, 여전히 입력 순서가 자연스럽지 않고 코드를 이해하는 데 약간의 부담이 남는다.
여기서 RangeKeyDict가 유용하다. RangeKeyDict({(start, end): value}) 형태로 범위(range) 를 키처럼 써서 값을 매핑할 수 있어, 날짜 구간을 코드가 아니라 데이터처럼 다룰 수 있다.
예시에서는 다음처럼 정책을 표현한다.
(date.min, date(2020, 1, 1))→None(date(2020, 1, 1), date(2020, 2, 2))→Decimal('0.01')(date(2020, 2, 2), date(2020, 8, 8))→Decimal('0.02')(date(2020, 8, 8), date.max)→Decimal('0.08')
이렇게 하면 date_to_point_rate_v3(base_date)는 매핑 객체에 날짜를 넣는 것만으로 끝난다. 날짜뿐 아니라 법령, 정책, 버전별 규칙처럼 구간별로 값이 달라지는 문제에도 유용하다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.