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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top