PyYAMLとしてDateTimeオブジェクトを作成する方法
質問
私はdatetime.datetime.now()
PyYAMLとしてDateTimeオブジェクトを作成できるようにしたいと思います。これは、いくつかの関数を呼び出すのは簡単です。
>>> y = """#YAML
... description: Something
... ts: !!python/object/apply:time.time []"""
>>> yaml.load(y)
{'description': 'Something', 'ts': 1289955567.940973}
>>>
しかし、私はdatetime.now()
を取得する方法を見つけ出すように見えることはできません。私はパイソン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
解決
私は、この例では、あなたが探しているものを実現すると考えます:
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'""")
他のヒント
問題は、オブジェクトが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
オブジェクトを所有して自分自身を見つけることができます。