PEP 500 – Ein Protokoll zur Delegation von Datetime-Methoden an ihre tzinfo-Implementierungen
- Autor:
- Alexander Belopolsky <alexander.belopolsky at gmail.com>, Tim Peters <tim.peters at gmail.com>
- Discussions-To:
- Datetime-SIG Liste
- Status:
- Abgelehnt
- Typ:
- Standards Track
- Benötigt:
- 495
- Erstellt:
- 08-Aug-2015
- Resolution:
- Datetime-SIG Nachricht
Zusammenfassung
Diese PEP spezifiziert ein neues Protokoll (PDDM - „Ein Protokoll zur Delegation von Datetime-Methoden“), das von konkreten Implementierungen der datetime.tzinfo Schnittstelle verwendet werden kann, um bewusste Datetime-Arithmetik, Formatierung und Parsing zu überschreiben. Wir beschreiben Änderungen an der datetime.datetime Klasse zur Unterstützung des neuen Protokolls und schlagen eine neue abstrakte Klasse datetime.tzstrict vor, die Teile dieses Protokolls implementiert, die notwendig sind, um bewusste Datetime-Instanzen nach „strengen“ arithmetischen Regeln zu verhalten.
Begründung
Ab Python 3.5 folgen bewusste Datetime-Instanzen, die ein tzinfo Objekt teilen, den Regeln der Arithmetik, die durch eine einfache Bijektion zwischen (Jahr, Monat, Tag, Stunde, Minute, Sekunde, Mikrosekunde) 7-Tupeln und großen ganzen Zahlen induziert werden. In dieser Arithmetik ist die Differenz zwischen JAHR-11-02T12:00 und JAHR-11-01T12:00 immer 24 Stunden, obwohl in der US/Eastern-Zeitzone beispielsweise 25 Stunden zwischen 2014-11-01T12:00 und 2014-11-02T12:00 liegen, da die lokalen Uhren um 2014-11-02T02:00 eine Stunde zurückgestellt wurden, was eine zusätzliche Stunde in der Nacht zwischen dem 01. und 02. November 2014 einführt.
Viele Geschäftsanwendungen erfordern die Verwendung der vereinfachten Sicht lokaler Daten in Python. Kein anständiges Autovermietungsunternehmen wird seinen Kunden mehr für eine Woche berechnen, die das Ende der Sommerzeit überspannt, als für jede andere Woche oder verlangen, dass sie das Auto eine Stunde früher zurückgeben. Daher wird die Änderung der aktuellen Regeln für bewusste Datetime-Arithmetik nicht nur zu einem Albtraum für die Abwärtskompatibilität führen, sondern auch die Unterstützung für legitime und gängige Anwendungsfälle beseitigen.
Da es unmöglich ist, universelle Regeln für die Arithmetik lokaler Zeiten zu wählen, schlagen wir vor, die Implementierung dieser Regeln an die Klassen zu delegieren, die die datetime.tzinfo Schnittstelle implementieren. Mit einer solchen Delegation können Benutzer zwischen verschiedenen Arithmetikarten wählen, indem sie einfach Instanzen verschiedener Klassen für den Wert von tzinfo auswählen.
Protokoll
Subtraktion von Datetime
Eine tzinfo-Unterklasse, die PDDM unterstützt, kann eine Methode namens __datetime_diff__ definieren, die zwei datetime.datetime-Instanzen entgegennehmen und eine datetime.timedelta-Instanz zurückgeben soll, die die Zeitspanne von der ersten Datetime-Instanz bis zur anderen darstellt.
Addition
Eine tzinfo-Unterklasse, die PDDM unterstützt, kann eine Methode namens __datetime_add__ definieren, die zwei Argumente – eine Datetime- und eine Timedelta-Instanz – entgegennehmen und eine Datetime-Instanz zurückgeben soll.
Subtraktion von Timedelta
Eine tzinfo-Unterklasse, die PDDM unterstützt, kann eine Methode namens __datetime_sub__ definieren, die zwei Argumente – eine Datetime- und eine Timedelta-Instanz – entgegennehmen und eine Datetime-Instanz zurückgeben soll.
Formatierung
Eine tzinfo-Unterklasse, die PDDM unterstützt, kann Methoden namens __datetime_isoformat__ und __datetime_strftime__ definieren.
Die Methode __datetime_isoformat__ soll eine Datetime-Instanz und einen optionalen Trennzeichen entgegennehmen und eine String-Repräsentation der gegebenen Datetime-Instanz erzeugen.
Die Methode __datetime_strftime__ soll eine Datetime-Instanz und eine Formatzeichenkette entgegennehmen und eine String-Repräsentation der gegebenen Datetime-Instanz erzeugen, formatiert gemäß der gegebenen Formatzeichenkette.
Parsing
Eine tzinfo-Unterklasse, die PDDM unterstützt, kann eine Klassenmethode namens __datetime_strptime__ definieren und die „kanonischen“ Namen der von ihr implementierten Zeitzonen in einem Registry registrieren. **TODO** Beschreiben Sie einen Registry.
Änderungen an Datetime-Methoden
Subtraktion
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
Addition
Die Addition eines Timedelta zu einer Datetime-Instanz wird an die Methode self.tzinfo.__datetime_add__ delegiert, wann immer diese definiert ist.
Strikte Arithmetik
Eine neue abstrakte Unterklasse der Klasse datetime.tzinfo namens datetime.tzstrict wird dem Modul datetime hinzugefügt. Diese Unterklasse wird nicht die Methoden utcoffset(), tzname() oder dst() implementieren, aber einige der Methoden des PDDM implementieren.
Die von tzstrict implementierten PDDM-Methoden entsprechen folgendem
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)
Parsing und Formatierung
Die Datetime-Methoden strftime und isoformat delegieren an die gleichnamigen Methoden ihrer tzinfo-Mitglieder, wann immer diese Methoden definiert sind.
Wenn der Methode datetime.strptime eine Formatzeichenkette übergeben wird, die eine %Z Anweisung enthält, wird sie die tzinfo Implementierung im Registry anhand des gegebenen Zeitzonennamens nachschlagen und ihre Methode __datetime_strptime__ aufrufen.
Anwendungen
Diese PEP ermöglicht die Implementierung vieler verschiedener Zeiterfassungssysteme durch Dritte, einschließlich
- Julianischer / Microsoft Excel Kalender.
- „Richtige“ Zeitzonen mit Unterstützung für Schaltsekunden.
- Französischer Revolutionskalender (mit viel Arbeit).
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0500.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT