PyYAML

2010-11-17 19 views
5
ile bir datetime nesnesi nasıl oluşturulur

datetime.datetime.now() PyYAML ile bir datetime nesnesi oluşturabiliyorum. Bazı işlevleri çağırmak kolaydır:PyYAML

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

Ancak, ben bir datetime.now() nasıl anlamaya görünüyor olamaz. Çeşitli python yaml tags'u kullanarak yapılan aramalarla çok fazla permütasyon denedim.

Bunlar

başarısız:

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 

cevap

5

Bu örnek, aradığınızı elde düşünüyorum: Ancak

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

, ben datetime.datetime.now olduğunu (PyYAML tarafından desteklenen !!python/object sözdizimi sınıf yöntemleri çağırmak gerekiyordu çünkü çok zoraki olduğunu düşünüyorum aslında datetime nesneleri için bir "statik" fabrika yöntemi gibi). Dediğiniz gibi, bu (aradığınız değil ne olsa da) daha basittir:

-iş çevresinde kolayca tefrika yüzden datetime.datetime.now çağrısı sarar özel yardımcı işlevi oluşturmak olacaktır Başka mümkündür
dt = yaml.load("dt: !!python/object/apply:time.gmtime []") 
dt = yaml.load("dt: !!python/object/apply:time.time []") 

o !!python/object/apply ile. Eksileri, bu serileştirmenin bu özel fonksiyonun bulunmadığı bir ortama taşınabilir olmamasıdır. Her neyse, bence, her zaman geçerli datetime (aslında YAML'nin ayrıştırıldığı zaman) olan bir değeri serileştirmek için çok fazla anlam ifade etmiyor. PyYAML, belirli bir zaman damgasını serileştirmek için bu kısayolu sunar:

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

Çok hoş. Bunun biraz sarsılmış bir kullanım durumu olduğunu kabul ediyorum, ancak çözümünüz başarmanın en kolay yolu gibi görünüyor. Bağlam için, Django aracılığıyla yüklenecek olan test verilerini oluşturmak için YAML'yi kullanarak araştırıyorum. Dosya yüklendiğinde oluşturulan veriye sahip olmak, birçok test için çok büyük bir avantaj olacaktır. Cevap için teşekkürler! – brianz

+1

fwiw, 'apply' ile python 3'te kaldırıldı, örnek artık çalışmıyor. Yani, ben aslında bu araştırmada biraz araştırma yaparken tökezlemeyi istemiyorum :) (wow 'pyyaml' delice!) –

0

sorun nesne PyYAML otomatik YAML gösterimini oluşturmak için gereken bir yöntem yoktur olmasıdır. Neden sadece datetime.datetime.now().isoformat() yapmıyor ve bunun yerine bu dizeyi saklıyorsunuz?

Alternatif olarak, datetime nesnesinin istenen özelliklerini bir sözlüğe koyabilir ve bunu yükleyebilirsiniz. Eğer isoformat dizesini saklamak istiyorsanız

, basitçe bir dize koydu ve onu dökümü:

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

Eğer geri okuduğumda kullanmak strptime() yöntemi:

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

Şüphesiz, sadece şunu yapabilirim: Sadece

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

yaml.load(yaml_timestamp) ile yüklerseniz, yeni bir datetime.datetime nesnesine sahip olursunuz.

+0

Sorun, yaml dosyası yüklendiğinde bu dinamik olarak oluşturulmasını istiyorum. İkinci çözümün bunu başarır mı? – brianz

+0

Aslında, sorunuzu yanlış yorumluyorum; Datetime nesnesini saklamak istediğini düşünüyordum. Yani, bir dizge oluşturmak için '.isoformat()' yöntemini kullanabilirsiniz, daha sonra strptime() '(http://docs.python.org/library/datetime.html#datetime.datetime.strptime) işlevini kullanabilirsiniz. dize bir datetime nesnesine dönüştürür. – syrion

+0

Peki ya bunu tam olarak bir yaml dosyasında piyaml kullanarak dinamik olarak nasıl yaparsınız? – brianz