我想能够创建与datetime.datetime.now() PyYAML日期时间对象。这很容易调用一些功能:

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

不过,我似乎无法弄清楚如何获得datetime.now()。我试着尽可能多的排列与使用各种蟒蛇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
有帮助吗?

解决方案

我认为你在寻找什么这个例子中实现了:

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

不过,我觉得实在是太牵强,因为PyYAML支持!!python/object语法不应该调用类的方法(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'""")

其他提示

的问题是,所述对象不具有一种方法,其PyYAML需要自动生成YAML表示。为什么不只是做datetime.datetime.now().isoformat()并存储该字符串代替?

或者,也可以把对象datetime的期望特性在一字典和载荷。

如果你想存储的isoformat串,简单地把它变成一个字符串,并转储:

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

在读回在,使用strptime()方法:

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

当然,欢快的,我刚刚意识到,你可以这样做:

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

如果您加载与yaml.load(yaml_timestamp),你会发现自己拥有一个闪亮的新datetime.datetime的对象。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top