Question

Je voudrais être en mesure de créer un objet datetime avec datetime.datetime.now() PyYAML. Il est facile d'appeler des fonctions:

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

Cependant, je ne peux pas à comprendre comment obtenir un datetime.now(). J'ai essayé autant de permutations avec des appels à l'aide que les différentes balises yaml python de rel="noreferrer">.

Tous ces échouent:

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
Était-ce utile?

La solution

Je pense que cet exemple atteint ce que vous cherchez:

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

Cependant, je pense qu'il est trop tiré par les cheveux, car la syntaxe de !!python/object pris en charge par PyYAML n'est pas censé appeler des méthodes de classe (datetime.datetime.now est en fait comme une méthode de fabrication « statique » pour les objets datetime). Comme vous l'avez dit, cela est plus simple (mais pas ce que vous cherchez):

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

Un autre travail autour serait possible de créer une fonction d'aide personnalisée qui enveloppe l'appel à datetime.datetime.now pour qu'il soit facilement avec sérialisé !!python/object/apply. Les inconvénients est que ce ne serait pas sérialisation portable à un environnement où cette fonction personnalisée ne se trouve pas.

Quoi qu'il en soit, à mon avis, il ne fait pas trop de sens pour sérialiser une valeur qui retourne toujours le datetime courant (qui serait en fait le moment où le YAML a été analysé). PyYAML fournit ce raccourci pour la sérialisation d'un certain horodatage:

dt = yaml.load("""dt: !!timestamp '2010-11-17 13:12:11'""")

Autres conseils

Le problème est que l'objet n'a pas une méthode qui PyYAML doit générer automatiquement la représentation YAML. Pourquoi ne pas simplement faire datetime.datetime.now().isoformat() et stocker cette chaîne à la place?

Alternativement, vous pouvez mettre les propriétés souhaitées de l'objet datetime dans un dictionnaire et charger que.

Si vous voulez stocker la chaîne de isoformat, mettez simplement dans une chaîne et le vider:

timestamp = datetime.datetime.now().isoformat()

Quand vous lisez le dans, utilisez la méthode strptime():

new_dt_object = datetime.datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S.%f')

Bien sûr, hilarante, je viens de réaliser que vous pouvez juste faire:

yaml_timestamp = yaml.dump({'timestamp': datetime.datetime.now()})

Si vous chargez avec yaml.load(yaml_timestamp) que, vous vous retrouvez en possession d'un objet nouveau datetime.datetime brillant.

scroll top