Como criar um objeto datetime com PyYAML
Pergunta
Eu gostaria de ser capaz de criar um objeto datetime com datetime.datetime.now()
PyYAML.É fácil ligar para algumas funções:
>>> y = """#YAML
... description: Something
... ts: !!python/object/apply:time.time []"""
>>> yaml.load(y)
{'description': 'Something', 'ts': 1289955567.940973}
>>>
No entanto, eu não consigo descobrir como chegar em um datetime.now()
.Eu tentei tantas permutações com chamadas para que, utilizando os vários python yaml tags.
Todos estes falhar:
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
Solução
Eu acho que este exemplo obtém o que você está procurando:
dt = yaml.load("""dt: !!python/object/apply:apply
- !!python/object/apply:getattr
- !!python/name:datetime.datetime
- now
- []
""")
No entanto, eu acho que é muito forçado, porque o !!python/object
sintaxe suportada pelo PyYAML não é suposto para chamar os métodos da classe (datetime.datetime.now
é, na verdade, como uma "estática" método de fábrica para objetos datetime).Como você disse, isso é mais simples (apesar de não ser o que você está procurando):
dt = yaml.load("dt: !!python/object/apply:time.gmtime []")
dt = yaml.load("dt: !!python/object/apply:time.time []")
Outra possível alternativa seria criar um personalizado função auxiliar que envolve a chamada para datetime.datetime.now
para que seja facilmente serializado com !!python/object/apply
.Os contras é que esta serialização não seria portátil para um ambiente onde essa função personalizada não é encontrado.
De qualquer maneira, na minha opinião, isso não faz muito sentido para serializar um valor que sempre retorna a data / hora actual (que na verdade seria o tempo quando o YAML foi analisado).PyYAML fornece este atalho para serialização de um determinado carimbo de data / hora:
dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""")
Outras dicas
O problema é que o objeto não tiver um método que PyYAML necessidades para gerar automaticamente o YAML representação.Por que não fazer datetime.datetime.now().isoformat()
e armazenamento de seqüência de caracteres em vez disso?
Como alternativa, você poderia colocar as propriedades desejadas do datetime
objeto em um dicionário e carga.
Se você deseja armazenar o isoformat string, basta colocá-lo em uma seqüência de caracteres e despejá-lo:
timestamp = datetime.datetime.now().isoformat()
Quando você lê-lo novamente, use o strptime()
método:
new_dt_object = datetime.datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S.%f')
Claro, hilária, eu só percebi que você só pode fazer:
yaml_timestamp = yaml.dump({'timestamp': datetime.datetime.now()})
Se você carregar com que yaml.load(yaml_timestamp)
, você vai encontrar-se na posse de um novo e brilhante datetime.datetime
objecto.