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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top