如何使用 PyYAML 创建日期时间对象
Posted
技术标签:
【中文标题】如何使用 PyYAML 创建日期时间对象【英文标题】:How to create a datetime object with PyYAML 【发布时间】:2011-05-11 04:20:06 【问题描述】:我希望能够使用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
【问题讨论】:
【参考方案1】:我认为这个例子达到了你想要的效果:
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'""")
【讨论】:
非常好。我同意这是一个有点复杂的用例,但您的解决方案看起来是最简单的方法。对于上下文,我正在研究使用 YAML 生成将通过 Django 加载的测试数据。在加载文件时生成数据对于许多测试来说是一个巨大的好处。感谢您的回答! fwiw,在 python 3 中删除了apply
,该示例不再有效。也就是说,我实际上并不想这样做,只是在做一些研究时偶然发现了这个答案:)(哇pyyaml
太疯狂了!)
!!timestamp
是我要找的,太好了! :)以上是关于如何使用 PyYAML 创建日期时间对象的主要内容,如果未能解决你的问题,请参考以下文章