Cómo crear un objeto datetime con PyYAML

Me gustaría poder crear un objeto datetime.datetime.now() con datetime.datetime.now() PyYAML. Es fácil llamar a algunas funciones:

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

Sin embargo, parece que no puedo averiguar cómo obtener un datetime.now() . He intentado tantas permutaciones con llamadas a eso utilizando las diversas tags yaml de python .

Todos estos fallan:

 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 

Creo que este ejemplo logra lo que estás buscando:

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

Sin embargo, creo que es demasiado inverosímil porque se supone que la syntax de !!python/object soportada por PyYAML no debe llamar a métodos de clase ( datetime.datetime.now es en realidad como un método de fábrica “estático” para objetos datetime). Como dijiste, esto es más simple (aunque no es lo que estás buscando):

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

Otra posible solución alternativa sería crear una función auxiliar personalizada que ajuste la llamada a datetime.datetime.now para que se pueda serializar fácilmente con !!python/object/apply . El inconveniente es que esta serialización no sería portátil a un entorno donde no se encuentra esta función personalizada.

De todos modos, en mi opinión, no tiene mucho sentido serializar un valor que siempre devuelva la fecha y hora actual (que en realidad sería la hora en que se analizó el YAML). PyYAML proporciona este acceso directo para serializar una determinada marca de tiempo:

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

El problema es que el objeto no tiene un método que PyYAML necesita para generar automáticamente la representación de YAML. ¿Por qué no hacer datetime.datetime.now().isoformat() y almacenar esa cadena en su lugar?

Alternativamente, puede colocar las propiedades deseadas del objeto datetime en un diccionario y cargarlo.

Si desea almacenar la cadena de isoformato, simplemente póngala en una cadena y voltee:

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

Cuando lo vuelvas a leer, usa el método strptime() :

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

Por supuesto, de manera hilarante, me he dado cuenta de que solo puedes hacer:

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

Si carga eso con yaml.load(yaml_timestamp) , se encontrará en posesión de un nuevo objeto datetime.datetime .