PyYaml

2012-11-22 26 views
13

ile üretilen YAML'ye yorum eklemek PyYaml kullanarak kendi python nesnelerimden Yaml belgeleri oluşturuyorum. örneğin benim nesne: PyYaml

class MyObj(object): 
    name = "boby" 
    age = 34 

olur: Şimdiye kadar iyi

boby: 
    age: 34 

.

Ama benzeyecek yüzden programlı üretilen YAML yorum eklemek için bir yol bulmuş değil:

boby:  # this is the name 
    age: 34 # in years 

kodu da PyYAML belgelerine bakarak ve ben bunu yaparken hiçbir şekilde bulundu.

herhangi bir öneriniz?

Muhtemelen PyYAML ile damping varsayılan ( print(yaml.dump(MyObj()))) tarafından gibi myObj sınıf için bazı DANIŞMANI var
+0

PyYAML ile büyük ölçüde kütüphanenin önemli bölümlerini yeniden yazmanın ve yorumların nasıl ele alınacağına dair bir takım kararlar almanın bir yolu olmadığından neredeyse eminim. Temsilci tarafından eklenen yorumlar (örneğin, sınıf başına) ister misiniz? Ya da her halükarda bir şekilde (daha da zor)? Bu biraz talihsiz bir şeydir, çünkü yorum ekleme yeteneği biraz yararlı olabilir. – cge

+0

Teşekkürler @cge. Yaabili dokümanları programlı olarak işlerken yorumları korumak çok yararlı olacaktır. –

+0

http://www.dzone.com/snippets/pyyaml-comment-emitter, Event/Dumper arayüzlerini kullanarak nasıl yapılacağını anlıyor görünmektedir. Henüz yanıt olarak yayınlamıyorum çünkü henüz çalışmaya doğrulanmadım. – kampu

cevap

4

size verecektir:

!!python/object:__main__.MyObj {} 

PyYAML yalnızca istediğiniz çıktıda yorumlarla bir şey yapabilirsiniz: onları atmak .

Ben geliştirilen PyYAML için gelişmiş sürümü de geri istenen çıktıyı okurdum, bir dicti içeren bir dict ile sonlanır ((isim bilgisi olmadığından {'boby': {'age': 34}}, bir MyObj() örneğini almak değildir) ruamel.yaml) yorumlarda YAML'da okuyabilir, yorumları saklayabilir ve dökümü yaparken yorumları yazabilir. İstediğiniz çıktıyı okursanız, sonuçta elde edilen veriler bir dict içeren bir taslak gibi görünecek (ve hareket edecektir), ancak gerçekte yorumların üstesinden gelebilecek daha karmaşık bir veri yapısı vardır. Ancak, ruamel.yaml, MyObj örneğini dökmenizi isterse ve o zaman yorumlar eklerseniz bu yapıyı oluşturabilirsiniz, istediğiniz çıktıyı elde edersiniz.

boby:  # this is the name 
    age: 34 # in years 

Eğer MyObj örneğini temsil etmek istiyorum kadar CommentedMap örneklerini oluşturma ile beklemeye gerek yoktur: yazdırır

from __future__ import print_function 

import sys 
import ruamel.yaml 
from ruamel.yaml.comments import CommentedMap 


class MyObj(): 
    name = "boby" 
    age = 34 

    def convert_to_yaml_struct(self): 
     x = CommentedMap() 
     a = CommentedMap() 
     x[data.name] = a 
     x.yaml_add_eol_comment('this is the name', 'boby', 11) 
     a['age'] = data.age 
     a.yaml_add_eol_comment('in years', 'age', 11) 
     return x 

    @staticmethod 
    def yaml_representer(dumper, data, flow_style=False): 
     assert isinstance(dumper, ruamel.yaml.RoundTripDumper) 
     return dumper.represent_dict(data.convert_to_yaml_struct()) 


ruamel.yaml.RoundTripDumper.add_representer(MyObj, MyObj.yaml_representer) 

ruamel.yaml.round_trip_dump(MyObj(), sys.stdout) 

. Ben örn. name ve age öğelerini, CommentedMap numaralı başvuruda/değerlerden alma/ayarlama özelliklerine dönüştürün. Bu şekilde yaml_representer statik yönteminden daha kolay yorum ekleyebilirsiniz böylece MyObj örneğini temsil etmek için çağrılır.