Я думаю, что этот пример достигает того, что вы ищете:
dt = yaml.load("""dt: !!python/object/apply:apply
- !!python/object/apply:getattr
- !!python/name:datetime.datetime
- now
- []
""")
Однако, я думаю, что это слишком надумано, потому что синтаксис !!python/object
, поддерживаемый PyYAML, не должен вызывать методы класса (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'""")