10

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

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

但是,我似乎无法弄清楚如何获得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
4

1 回答 1

9

我认为这个例子实现了你正在寻找的东西:

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

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

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'""")
于 2010-11-17T16:53:32.967 回答