How to create a datetime object with PyYAML

爱⌒轻易说出口 提交于 2019-12-23 08:29:23

问题


I'd like to be able to create a datetime object with datetime.datetime.now() PyYAML. It's easy to call some functions:

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

However, I can't seem to figure out how to get a datetime.now(). I've tried as many permutations with calls to that using the various python yaml tags.

These all fail:

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

回答1:


I think this example achieves what you're looking for:

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

However, I think it is too far-fetched because the !!python/object syntax supported by PyYAML is not supposed to call class methods (datetime.datetime.now is actually like a "static" factory method for datetime objects). As you said, this is simpler (though not what you're looking for):

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

Another possible work-around would be to create a custom helper function that wraps the call to datetime.datetime.now so that it is easily serialized with !!python/object/apply. The cons is that this serialization would not be portable to an environment where this custom function is not found.

Anyway, in my opinion it does not make too much sense to serialize a value that always returns the current datetime (which would actually be the time when the YAML was parsed). PyYAML provides this shortcut for serializing a certain timestamp:

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



回答2:


The problem is that the object doesn't have a method that PyYAML needs to automatically generate the YAML representation. Why not just do datetime.datetime.now().isoformat() and store that string instead?

Alternately, you could put the desired properties of the datetime object in a dictionary and load that.

If you want to store the isoformat string, simply put it into a string and dump it:

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

When you read it back in, use the strptime() method:

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

Of course, hilariously, I've just realized that you can just do:

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

If you load that with yaml.load(yaml_timestamp), you'll find yourself in possession of a shiny new datetime.datetime object.



来源:https://stackoverflow.com/questions/4200627/how-to-create-a-datetime-object-with-pyyaml

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!