我希望能够使用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 tags来调用那些更多的排列。
这些都失败了:
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
答案 0 :(得分:6)
我认为这个例子可以实现您的目标:
dt = yaml.load("""dt: !!python/object/apply:apply
- !!python/object/apply:getattr
- !!python/name:datetime.datetime
- now
- []
""")
但是,我认为它太牵强了,因为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'""")
答案 1 :(得分:0)
问题是该对象没有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
对象。