如何使用 PyYAML 创建日期时间对象 [英] How to create a datetime object with PyYAML
问题描述
我希望能够使用 datetime.datetime.now()
PyYAML 创建一个日期时间对象.调用一些函数很容易:
但是,我似乎无法弄清楚如何获得 datetime.now()
.我已经尝试了尽可能多的排列,并使用各种 python yaml 标签调用该排列.
这些都失败了:
测试 = ['dt: !!python/object:datetime.datetime.now []','dt: !!python/object/new:datetime.datetime.now []','dt: !!python/object/apply:datetime.datetime.now []',]对于测试中的 y:尝试:打印 yaml.load(y)除了异常,错误:打印'==>',错误
我认为这个例子实现了你想要的:
dt = yaml.load("""dt: !!python/object/apply:apply- !!python/object/apply:getattr- !!python/name:datetime.datetime- 现在- []""")
但是,我认为它太牵强了,因为 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'""")
I'd like to be able to create a datetime object with datetime.datetime.now()
PyYAML. It's easy to call some functions:
>>> y = """#YAML
... description: Something
... ts: !!python/object/apply:time.time []"""
>>> yaml.load(y)
{'description': 'Something', 'ts': 1289955567.940973}
>>>
However, I can't seem to figure out how to get a datetime.now()
. I've tried as many permutations with calls to that using the various python yaml tags.
These all fail:
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
I think this example achieves what you're looking for:
dt = yaml.load("""dt: !!python/object/apply:apply
- !!python/object/apply:getattr
- !!python/name:datetime.datetime
- now
- []
""")
However, I think it is too far-fetched because the !!python/object
syntax supported by PyYAML is not supposed to call class methods (datetime.datetime.now
is actually like a "static" factory method for datetime objects). As you said, this is simpler (though not what you're looking for):
dt = yaml.load("dt: !!python/object/apply:time.gmtime []")
dt = yaml.load("dt: !!python/object/apply:time.time []")
Another possible work-around would be to create a custom helper function that wraps the call to datetime.datetime.now
so that it is easily serialized with !!python/object/apply
. The cons is that this serialization would not be portable to an environment where this custom function is not found.
Anyway, in my opinion it does not make too much sense to serialize a value that always returns the current datetime (which would actually be the time when the YAML was parsed). PyYAML provides this shortcut for serializing a certain timestamp:
dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""")
这篇关于如何使用 PyYAML 创建日期时间对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!