题
我想能够创建与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
的对象。