PEP 500 – datetime 메서드를 해당 tzinfo 구현에 위임하기 위한 프로토콜
- Author:
- Alexander Belopolsky <alexander.belopolsky at gmail.com>, Tim Peters <tim.peters at gmail.com>
- Discussions-To:
- Datetime-SIG list
- Status:
- Rejected
- Type:
- Standards Track
- Requires:
- 495
- Created:
- 08-Aug-2015
- Resolution:
- Datetime-SIG message
Table of Contents
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
추상
이 PEP는 datetime.tzinfo 인터페이스의 구체적인 구현에서 aware datetime의 산술 연산, 형식 지정 및 구문 분석을 재정의하는 데 사용할 수 있는 새로운 프로토콜(PDDM - “datetime 메서드 위임 프로토콜”)을 지정합니다. 새로운 프로토콜을 지원하도록 datetime.datetime 클래스를 변경하는 내용을 설명하고, aware datetime 인스턴스가 “strict” 산술 규칙을 따르도록 하는 데 필요한 이 프로토콜의 일부를 구현하는 새로운 추상 클래스 datetime.tzstrict를 제안합니다.
근거
Python 3.5부터 동일한 tzinfo 객체를 공유하는 aware datetime 인스턴스는 (연, 월, 일, 시, 분, 초, 마이크로초) 7-튜플과 큰 정수 사이의 단순한 전단사에 의해 유도되는 산술 연산 규칙을 따릅니다. 이 산술 연산에서 YEAR-11-02T12:00과 YEAR-11-01T12:00의 차이는 항상 24시간입니다. 예를 들어 US/Eastern 시간대에서는 2014-11-01T12:00과 2014-11-02T12:00 사이에 25시간이 있는데도 그러합니다. 이는 2014-11-02T02:00에 현지 시계가 한 시간 뒤로 조정되어 2014-11-01과 2014-11-02 사이의 밤에 한 시간이 추가되었기 때문입니다.
많은 비즈니스 애플리케이션에서는 Python의 단순화된 현지 날짜 관점을 사용해야 합니다. 제대로 운영되는 자동차 렌트 회사라면 DST 종료 시점을 걸치는 일주일에 다른 어떤 일주일보다 더 많이 고객에게 청구하거나, 자동차를 한 시간 일찍 반납하도록 요구하지 않을 것입니다. 따라서 aware datetime 산술 연산에 대한 현재 규칙을 변경하면 하위 호환성의 악몽을 초래할 뿐만 아니라, 정당하고 흔히 사용되는 사례에 대한 지원도 없애게 됩니다.
현지 시간 산술 연산에 보편적으로 적용할 수 있는 규칙을 선택하는 것은 불가능하므로, 그러한 규칙의 구현을 datetime.tzinfo 인터페이스를 구현하는 클래스에 위임할 것을 제안합니다. 이러한 위임을 적용하면 사용자는 tzinfo 값에 서로 다른 클래스의 인스턴스를 선택하는 것만으로 서로 다른 산술 연산을 선택할 수 있습니다.
프로토콜
datetime 뺄셈
PDDM을 지원하는 tzinfo 서브클래스는 __datetime_diff__라는 메서드를 정의할 수 있으며, 이 메서드는 두 datetime.datetime 인스턴스를 받아 첫 번째 datetime 인스턴스가 나타내는 시점부터 다른 인스턴스가 나타내는 시점까지 경과한 시간을 나타내는 datetime.timedelta 인스턴스를 반환해야 합니다.
덧셈
PDDM을 지원하는 tzinfo 서브클래스는 __datetime_add__라는 메서드를 정의할 수 있으며, 이 메서드는 datetime 인스턴스와 timedelta 인스턴스라는 두 인자를 받아 datetime 인스턴스를 반환해야 합니다.
timedelta 뺄셈
PDDM을 지원하는 tzinfo 서브클래스는 __datetime_sub__라는 메서드를 정의할 수 있으며, 이 메서드는 datetime 인스턴스와 timedelta 인스턴스라는 두 인자를 받아 datetime 인스턴스를 반환해야 합니다.
형식 지정
PDDM을 지원하는 tzinfo 서브클래스는 __datetime_isoformat__ 및 __datetime_strftime__이라는 메서드를 정의할 수 있습니다.
__datetime_isoformat__ 메서드는 datetime 인스턴스와 선택적 구분 기호를 받아 지정된 datetime 인스턴스의 문자열 표현을 생성해야 합니다.
__datetime_strftime__ 메서드는 datetime 인스턴스와 형식 문자열을 받아 지정된 형식에 따라 형식화된 datetime 인스턴스의 문자열 표현을 생성해야 합니다.
구문 분석
PDDM을 지원하는 tzinfo 서브클래스는 __datetime_strptime__이라는 클래스 메서드를 정의하고, 자신이 구현하는 시간대의 “canonical” 이름을 레지스트리에 등록해야 합니다. TODO 레지스트리를 설명합니다.
datetime 메서드의 변경 사항
뺄셈
class datetime:
def __sub__(self, other):
if isinstance(other, datetime):
try:
self_diff = self.tzinfo.__datetime_diff__
except AttributeError:
self_diff = None
try:
other_diff = self.tzinfo.__datetime_diff__
except AttributeError:
other_diff = None
if self_diff is not None:
if self_diff is not other_diff and self_diff.__func__ is not other_diff.__func__:
raise ValueError("Cannot find difference of two datetimes with "
"different tzinfo.__datetime_diff__ implementations.")
return self_diff(self, other)
elif isinstance(other, timedelta):
try:
sub = self.tzinfo.__datetime_sub__
except AttributeError:
pass
else:
return sub(self, other)
return self + -other
else:
return NotImplemented
# current implementation
덧셈
datetime 인스턴스에 timedelta를 더하는 작업은 self.tzinfo.__datetime_add__ 메서드가 정의되어 있는 경우 해당 메서드에 위임됩니다.
엄격한 산술 연산
datetime.tzinfo 클래스의 새로운 추상 서브클래스인 datetime.tzstrict가 datetime 모듈에 추가됩니다. 이 서브클래스는 utcoffset(), tzname() 또는 dst() 메서드를 구현하지 않지만, PDDM 메서드의 일부를 구현합니다.
tzstrict가 구현하는 PDDM 메서드는 다음과 동등합니다.:
class tzstrict(tzinfo):
def __datetime_diff__(self, dt1, dt2):
utc_dt1 = dt1.astimezone(timezone.utc)
utc_dt2 = dt2.astimezone(timezone.utc)
return utc_dt2 - utc_dt1
def __datetime_add__(self, dt, delta):
utc_dt = dt.astimezone(timezone.utc)
return (utc_dt + delta).astimezone(self)
def __datetime_sub__(self, dt, delta):
utc_dt = dt.astimezone(timezone.utc)
return (utc_dt - delta).astimezone(self)
파싱과 서식화
datetime 메서드인 strftime과 isoformat은 해당 메서드가 정의되어 있을 때마다 자신의 tzinfo 멤버의 동명 메서드에 위임합니다.
datetime.strptime 메서드에 %Z 지시어가 포함된 서식 문자열이 주어지면, 주어진 시간대 이름으로 레지스트리에서 tzinfo 구현을 조회하여 그 __datetime_strptime__ 메서드를 호출합니다.
응용
이 PEP는 다음을 포함하여 다양한 시간 기록 방식의 서드파티 구현을 가능하게 합니다:
- 율리우스력 / Microsoft Excel 달력.
- 윤초를 지원하는 “Right” 시간대.
- 프랑스 혁명력(많은 작업이 필요함).
Copyright
This document has been placed in the public domain.