Wie ein Datetime-Objekt mit PyYAML erstellen
Frage
Ich möchte in der Lage sein, ein Datetime-Objekt mit datetime.datetime.now()
PyYAML zu erstellen. Es ist einfach, einige Funktionen zu nennen:
>>> y = """#YAML
... description: Something
... ts: !!python/object/apply:time.time []"""
>>> yaml.load(y)
{'description': 'Something', 'ts': 1289955567.940973}
>>>
Allerdings kann ich nicht scheinen, um herauszufinden, wie man eine datetime.now()
zu bekommen. Ich habe versucht, so viele Permutationen mit Aufrufen an, dass unter Verwendung der verschiedenen Python yaml Tags .
Diese alle fehlschlagen:
tests = [
'dt: !!python/object:datetime.datetime.now []',
'dt: !!python/object/new:datetime.datetime.now []',
'dt: !!python/object/apply:datetime.datetime.now []',
]
for y in tests:
try:
print yaml.load(y)
except Exception, err:
print '==>', err
Lösung
Ich denke, dieses Beispiel das erreicht, was Sie suchen:
dt = yaml.load("""dt: !!python/object/apply:apply
- !!python/object/apply:getattr
- !!python/name:datetime.datetime
- now
- []
""")
Aber ich denke, es ist zu weit hergeholt, da die !!python/object
Syntax von PyYAML unterstützte nicht zu Call Klassenmethoden soll (datetime.datetime.now
ist eigentlich wie eine „statische“ Factory-Methode für Datetime-Objekte). Wie Sie gesagt haben, ist dies einfacher (wenn auch nicht das, was Sie suchen):
dt = yaml.load("dt: !!python/object/apply:time.gmtime []")
dt = yaml.load("dt: !!python/object/apply:time.time []")
Eine weitere mögliche Behelfslösung wäre eine eigene Hilfsfunktion zu erstellen, um den Anruf zu datetime.datetime.now
wickelt, so dass sie leicht mit !!python/object/apply
serialisiert wird. Die Nachteile sind, dass diese Serialisierung portable nicht in eine Umgebung sein würde, wo diese benutzerdefinierte Funktion nicht gefunden wird.
Wie auch immer, meiner Meinung nach ist es nicht zu viel Sinn machen, um einen Wert zu serialisiert, die immer die aktuelle Datetime zurückgibt (die eigentlich die Zeit sein würde, wenn der YAML analysiert wurde). PyYAML bietet diese Abkürzung für einen bestimmten Zeitstempel Serialisierung:
dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""")
Andere Tipps
Das Problem ist, dass das Objekt nicht eine Methode hat, dass PyYAML benötigt, um automatisch die YAML Darstellung zu erzeugen. Warum nicht einfach tun datetime.datetime.now().isoformat()
und speichert diese Zeichenfolge statt?
Alternativ können Sie die gewünschten Eigenschaften des datetime
Objekts in einem Wörterbuch setzen könnten und Last der.
Wenn Sie die isoformat Zeichenfolge speichern möchten, einfach steckte es in einen String und Dump es:
timestamp = datetime.datetime.now().isoformat()
Wenn Sie es wieder in, verwenden Sie die strptime()
Methode lesen:
new_dt_object = datetime.datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S.%f')
Natürlich umwerfend, ich habe gerade realisiert, dass Sie gerade tun:
yaml_timestamp = yaml.dump({'timestamp': datetime.datetime.now()})
Wenn Sie das mit yaml.load(yaml_timestamp)
laden Sie ein, sich in den Besitz eines glänzenden neuen datetime.datetime
Objekt finden werden.