如何使用 PyYAML 创建日期时间对象 [英] How to create a datetime object with PyYAML

查看:30
本文介绍了如何使用 PyYAML 创建日期时间对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望能够使用 datetime.datetime.now() PyYAML 创建一个日期时间对象.调用一些函数很容易:

<预><代码>>>>y = """#YAML... 描述:某事... ts: !!python/object/apply:time.time []""">>>yaml.load(y){'description': 'Something', 'ts': 1289955567.940973}>>>

但是,我似乎无法弄清楚如何获得 datetime.now().我已经尝试了尽可能多的排列,并使用各种 python yaml 标签调用该排列.

这些都失败了:

测试 = ['dt: !!python/object:datetime.datetime.now []','dt: !!python/object/new:datetime.datetime.now []','dt: !!python/object/apply:datetime.datetime.now []',]对于测试中的 y:尝试:打印 yaml.load(y)除了异常,错误:打印'==>',错误

解决方案

我认为这个例子实现了你想要的:

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

但是,我认为它太牵强了,因为 PyYAML 支持的 !!python/object 语法不应该调用类方法(datetime.datetime.now 实际上就像日期时间对象的静态"工厂方法).正如你所说,这更简单(虽然不是你要找的):

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

另一种可能的解决方法是创建一个自定义的辅助函数来包装对 datetime.datetime.now 的调用,以便使用 !!python/object/apply 轻松序列化.缺点是此序列化无法移植到找不到此自定义函数的环境中.

无论如何,在我看来,序列化一个总是返回当前日期时间(实际上是解析 YAML 的时间)的值并没有太大意义.PyYAML 提供了序列化某个时间戳的快捷方式:

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

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

解决方案

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'""")

这篇关于如何使用 PyYAML 创建日期时间对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆