如何使用PyYAML创建当前本地日期和时间
我想用 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 标签 来调用它。
但是这些都不行:
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 个回答
10
我觉得这个例子达到了你想要的效果:
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'""")