10

datetime.datetime.now()PyYAMLを使用して日時オブジェクトを作成できるようにしたいと思います。いくつかの関数を呼び出すのは簡単です:

>>> y = """#YAML
... description: Something
... ts: !!python/object/apply:time.time []"""
>>> yaml.load(y)
{'description': 'Something', 'ts': 1289955567.940973}
>>> 

ただし、の取得方法がわからないようですdatetime.now()さまざまなpythonyamlタグを使用して、それを呼び出すことで多くの順列を試しました。

これらはすべて失敗します:

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
4

1 に答える 1

9

この例はあなたが探しているものを達成すると思います:

dt = yaml.load("""dt: !!python/object/apply:apply
    - !!python/object/apply:getattr
        - !!python/name:datetime.datetime
        - now
    - []
""")

!!python/objectただし、 PyYAMLでサポートされている構文は、クラスメソッド(datetime.datetime.now実際には日時オブジェクトの「静的」ファクトリメソッドのようなもの)を呼び出すことを想定していないため、あまりにも遠いものだと思います。あなたが言ったように、これはもっと簡単です(あなたが探しているものではありませんが):

dt = yaml.load("dt: !!python/object/apply:time.gmtime []")
dt = yaml.load("dt: !!python/object/apply:time.time []")

もう1つの考えられる回避策は、への呼び出しをラップするカスタムヘルパー関数を作成して、datetime.datetime.nowで簡単にシリアル化できるようにすることです!!python/object/apply。短所は、このシリアル化は、このカスタム関数が見つからない環境に移植できないことです。

とにかく、私の意見では、常に現在の日時(実際にはYAMLが解析された時刻)を返す値をシリアル化することはあまり意味がありません。PyYAMLは、特定のタイムスタンプをシリアル化するための次のショートカットを提供します。

dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""")
于 2010-11-17T16:53:32.967 に答える