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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top