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
.