Cómo crear un objeto de fecha y hora con PyYAML
Pregunta
Me gustaría ser capaz de crear un objeto de fecha y hora 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, me parece que no puede encontrar la manera de conseguir un datetime.now()
. He intentado tantas permutaciones con llamadas a que el uso de los diversos pitón yaml etiquetas .
Estos todos fallar:
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
Solución
Creo que este ejemplo consigue lo que usted está buscando:
dt = yaml.load("""dt: !!python/object/apply:apply
- !!python/object/apply:getattr
- !!python/name:datetime.datetime
- now
- []
""")
Sin embargo, creo que es demasiado exagerado porque la sintaxis !!python/object
apoyado por PyYAML no se supone que los métodos de clase llamada (datetime.datetime.now
es en realidad como un método de fábrica "estática" de fecha y hora de objetos). Como usted ha dicho, esto es más simple (aunque no 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 la creación de una función de ayuda a medida que envuelve la llamada a datetime.datetime.now
de modo que es fácilmente serializado con !!python/object/apply
. Las desventajas es que esta serialización no sería portátil a un ambiente donde no se encuentra esta función personalizada.
De todos modos, en mi opinión, no tiene mucho sentido para serializar un valor que siempre devuelve la fecha y hora actuales (que en realidad sería el momento en el que se ha analizado YAML). PyYAML ofrece este acceso directo para serializar una cierta marca de tiempo:
dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""")
Otros consejos
El problema es que el objeto no tiene un método que PyYAML necesita para generar automáticamente la representación YAML. ¿Por qué no simplemente hacer datetime.datetime.now().isoformat()
y almacenar esa cadena en su lugar?
Como alternativa, se podría poner las propiedades deseadas del objeto datetime
en un diccionario y la carga que.
Si desea almacenar la cadena isoformat, simplemente ponerlo en una cadena y lo descarga:
timestamp = datetime.datetime.now().isoformat()
Cuando se lee de nuevo, utilice el método strptime()
:
new_dt_object = datetime.datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S.%f')
Por supuesto, hilarante, me acabo de dar cuenta que sólo puede hacer:
yaml_timestamp = yaml.dump({'timestamp': datetime.datetime.now()})
Si carga que con yaml.load(yaml_timestamp)
, se encontrará en posesión de un nuevo objeto datetime.datetime
brillante.