2012-12-22 29 views
6

Bir bilgisayar için YAML ve simülatör için insan tarafından düzenlenebilir ve okunabilir giriş biçimi kullanıyorum. İnsan okunabilirliği için, girdinin bazı kısımları çoğunlukla blok stiline uygundur, akış stili ise başkalarına daha iyi uymaktadır.PyYAML dökümündeki bölümlerin stilleri belirtme

PyYAML için varsayılan iç içe haritalar veya diziler vardır her yerde blok stili kullanan ve diğer her yerde stil akmaya etmektir. * default_flow_style *, biri tüm akış stili veya tüm blok stilini seçmeye izin verir.

Ama çıkış formunun daha fazla dosya istiyorum

bonds: 
- { strength: 2.0 } 
- ... 
tiles: 
- { color: red, edges: [1, 0, 0, 1], stoic: 0.1} 
- ... 
args: 
    block: 2 
    Gse: 9.4 

görülebileceği gibi, bu boyunca stilleri için tutarlı bir model izleyin ve yerine dosyasının bir parçası bağlı değişir gelmez . Esasen, bazı blok stil dizilerindeki tüm değerlerin akış stilinde olmasını belirtmek isterim. Bu tür düşük seviyeli damping kontrolünün bir yolu var mı? Üst düzey haritalamayı belirli bir düzende o sıraya gereksinim duymadan (örneğin, omap) okumaya muktedir olmak, okunabilirlik açısından iyi olacaktır.

cevap

11

Bu ben default_flow_style takip etmek değil istediğiniz her öğe için representers ile alt sınıfları tanımlayan ve daha sonra damping öncekiler için gereken her şeyi dönüştürerek yapılabilir çıkıyor. Bu durumda, ben böyle bir şey olsun şu anlama gelir:

class blockseq(dict): pass 
def blockseq_rep(dumper, data): 
    return dumper.represent_mapping(u'tag:yaml.org,2002:map', data, flow_style=False) 

class flowmap(dict): pass 
def flowmap_rep(dumper, data): 
    return dumper.represent_mapping(u'tag:yaml.org,2002:map', data, flow_style=True) 

yaml.add_representer(blockseq, blockseq_rep) 
yaml.add_representer(flowmap, flowmap_rep) 

def dump(st): 
    st['tiles'] = [ flowmap(x) for x in st['tiles'] ] 
    st['bonds'] = [ flowmap(x) for x in st['bonds'] ] 
    if 'xgrowargs' in st.keys(): st['xgrowargs'] = blockseq(st['xgrowargs']) 
    return yaml.dump(st) 

Annoyingly, izin vermez kolay kullanımlı dumper.represent_list ve dumper.represent_dict flow_style belirtilmesi, bu yüzden etiketi belirlemek zorunda ama sistem çalışıyor.

+0

yorumunuz hala mi yukarı güncel 'dumper.represent_sequence' ve' bir seçenek flow_style olmamasından dumper.represent_dict' hakkında? http://pyyaml.org/wiki/PyYAMLDocumentation#Dumper – Hotschke

+0

Aslında "flowmap" işlevini bir sıralamaya uyguladım: - kenarlar: \ n - [1,2] \ n - [2, 1, [1 , 0]] '. Her kenarı tek bir ayrı satırda olmasını istiyorum ('\ n' ile belirtildiği gibi). Şimdilik, şunun gibi görünüyor: '- kenarlar: \ n - [1,2] \ n - 1 \ n - 2 \ n - [1, 0]' – Hotschke

+0

Evet, yorumum hala geçerli; 'repres_mapping' var, ama diğer ikisi yok; Muhtemelen sadece 'repres_mapping' için sarmalayıcılar. Yaptığın şey için, akış haritası istediğin şey değil. Flow_style = Olmak istediğiniz kenarlar :) altında bir sıra sizsiniz. – cge