bri*_*anz 8 python yaml pyyaml
我希望能够使用datetime.datetime.now()PyYAML 创建一个datetime对象.调用一些函数很容易:
>>> y = """#YAML
... description: Something
... ts: !!python/object/apply:time.time []"""
>>> yaml.load(y)
{'description': 'Something', 'ts': 1289955567.940973}
>>>
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法弄清楚如何获得一个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
Run Code Online (Sandbox Code Playgroud)
我认为这个例子实现了你想要的:
dt = yaml.load("""dt: !!python/object/apply:apply
- !!python/object/apply:getattr
- !!python/name:datetime.datetime
- now
- []
""")
Run Code Online (Sandbox Code Playgroud)
但是,我认为它太牵强了,因为!!python/objectPyYAML支持的语法不应该调用类方法(datetime.datetime.now实际上就像是datetime对象的"静态"工厂方法).正如你所说,这更简单(虽然不是你想要的):
dt = yaml.load("dt: !!python/object/apply:time.gmtime []")
dt = yaml.load("dt: !!python/object/apply:time.time []")
Run Code Online (Sandbox Code Playgroud)
另一种可能的解决方法是创建一个自定义辅助函数来封装调用,datetime.datetime.now以便它可以很容易地序列化!!python/object/apply.缺点是此序列化不能移植到找不到此自定义功能的环境.
无论如何,在我看来,序列化一个总是返回当前日期时间的值(实际上是解析YAML的时间)并没有多大意义.PyYAML提供了此序列化某个时间戳的快捷方式:
dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""")
Run Code Online (Sandbox Code Playgroud)