2010-11-17 12 views
5

Mi piacerebbe essere in grado di creare un oggetto datetime con datetime.datetime.now() PyYAML. E 'facile chiamare alcune funzioni:Come creare un oggetto datetime con PyYAML

>>> y = """#YAML 
... description: Something 
... ts: !!python/object/apply:time.time []""" 
>>> yaml.load(y) 
{'description': 'Something', 'ts': 1289955567.940973} 
>>> 

Tuttavia, non riesco a capire come ottenere un datetime.now(). Ho provato tutte le permutazioni con le chiamate a quello usando i vari python yaml tags.

Questi tutti falliscono:

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 

risposta

5

Penso che questo esempio ottiene quello che stai cercando:

dt = yaml.load("""dt: !!python/object/apply:apply 
    - !!python/object/apply:getattr 
     - !!python/name:datetime.datetime 
     - now 
    - [] 
""") 

Tuttavia, penso che sia troppo inverosimile, perché il !!python/object sintassi supportata da PyYAML non dovrebbe chiamare i metodi della classe (datetime.datetime.now è in realtà mi piace un metodo factory "statico" per oggetti datetime). Come lei ha detto, questo è più semplice (anche se non quello che stai cercando):

dt = yaml.load("dt: !!python/object/apply:time.gmtime []") 
dt = yaml.load("dt: !!python/object/apply:time.time []") 

Un'altra possibile work-around sarebbe quello di creare una funzione di supporto personalizzato che avvolge la chiamata a datetime.datetime.now in modo che sia facilmente serializzato con !!python/object/apply. Il contro è che questa serializzazione non sarebbe portabile in un ambiente in cui questa funzione personalizzata non è stata trovata.

In ogni caso, a mio parere non ha molto senso serializzare un valore che restituisce sempre il datetime corrente (che sarebbe in realtà il momento in cui è stato analizzato lo YAML). PyYAML prevede questa scorciatoia per la serializzazione di una certa data e ora:

dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""") 
+0

Molto bello. Sono d'accordo che questo è un caso d'uso un po 'contorto, ma la tua soluzione sembra il modo più semplice per realizzare. Per il contesto, sto studiando utilizzando YAML per generare dati di test che verranno caricati tramite Django. Avere dati generati quando il file viene caricato sarebbe un enorme vantaggio per molti test. Grazie per la risposta! – brianz

+1

fwiw, con 'apply' rimosso in python 3 l'esempio non funziona più. Detto questo, in realtà non sto cercando di farlo solo inciampando su questa risposta mentre faccio qualche ricerca :) (wow 'pyyaml' è folle!) –

0

Il problema è che l'oggetto non ha un metodo che PyYAML deve generare automaticamente la rappresentazione YAML. Perché non fare semplicemente datetime.datetime.now().isoformat() e memorizzare quella stringa?

In alternativa, è possibile inserire le proprietà desiderate dell'oggetto datetime in un dizionario e caricarlo.

Se si desidera memorizzare la stringa isoformat, è sufficiente mettere in una stringa e discarica:

timestamp = datetime.datetime.now().isoformat()

Quando si legge indietro nel, utilizza il metodo strptime():

new_dt_object = datetime.datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S.%f')

Naturalmente, esilarante, ho appena capito che si può solo fare:

yaml_timestamp = yaml.dump({'timestamp': datetime.datetime.now()})

se si carica che con yaml.load(yaml_timestamp), vi troverete in possesso di un nuovo fiammante datetime.datetime oggetto.

+0

Il problema è che mi piacerebbe questo generato dinamicamente quando viene caricato il file YAML. La tua seconda soluzione lo realizzerebbe? – brianz

+0

In realtà, ho letto male la tua domanda; Stavo pensando che volevi memorizzare l'oggetto datetime. Detto questo, potresti usare il metodo '.isoformat()' per generare una stringa, quindi usare 'strptime()' (http://docs.python.org/library/datetime.html#datetime.datetime.strptime) per convertire la stringa in un oggetto datetime. – syrion

+0

E con quale precisione lo faresti dinamicamente in un file yaml usando pyyaml? – brianz

Problemi correlati