如何使用PyYAML创建日期时间对象

bri*_*anz 8 python yaml pyyaml

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

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

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

这些都失败了:

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
Run Code Online (Sandbox Code Playgroud)

sco*_*fey 6

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

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

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

dt = yaml.load("dt: !!python/object/apply:time.gmtime []")
dt = yaml.load("dt: !!python/object/apply:time.time []")
Run Code Online (Sandbox Code Playgroud)

另一种可能的解决方法是创建一个自定义辅助函数来封装调用,datetime.datetime.now以便它可以很容易地序列化!!python/object/apply.缺点是此序列化不能移植到找不到此自定义功能的环境.

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

dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""")
Run Code Online (Sandbox Code Playgroud)

  • fwiw,在python 3中删除了`apply`,该示例不再有效。也就是说,我实际上并不打算这样做,只是在做一些研究时偶然发现了这个答案:)(哇`pyyaml` 太疯狂了!) (2认同)