2012-12-22 30 views
6

मैं कंप्यूटर के लिए वाईएएमएल और सिम्युलेटर के लिए मानव-संपादन योग्य और पठनीय इनपुट प्रारूप का उपयोग कर रहा हूं। मानव पठनीयता के लिए, इनपुट के कुछ हिस्सों को शैली को अवरुद्ध करने के लिए अधिकतर सक्षम हैं, जबकि प्रवाह शैली दूसरों को बेहतर बनाती है।एक PyYAML डंप के हिस्सों के लिए शैलियों को निर्दिष्ट करना

PyYAML के लिए डिफ़ॉल्ट ब्लॉक शैली का उपयोग करना है जहां कहीं भी नेस्टेड मानचित्र या अनुक्रम हैं, और हर जगह प्रवाह शैली है। * default_flow_style * किसी को सभी-प्रवाह-शैली या ऑल-ब्लॉक-शैली चुनने की अनुमति देता है।

लेकिन मैं उत्पादन फार्म की अधिक फ़ाइलों करना चाहते हैं

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

के रूप में देखा जा सकता है, इस शैली के लिए संगत प्रतिमान भर का पालन नहीं करता, और बदले फ़ाइल के भाग के आधार पर बदल जाता है । अनिवार्य रूप से, मैं यह निर्दिष्ट करने में सक्षम होना चाहता हूं कि कुछ ब्लॉक शैली अनुक्रमों में सभी मान प्रवाह शैली में हैं। क्या डंपिंग पर उस तरह के अच्छे स्तर के नियंत्रण को पाने का कोई तरीका है? उस क्रम की आवश्यकता नहीं होने पर किसी विशेष क्रम में शीर्ष-स्तरीय मानचित्रण को डंप करने में सक्षम होने के नाते (उदाहरण के लिए, ओमैप) पठनीयता के लिए भी अच्छा होगा।

उत्तर

11

यह पता चला है कि यह प्रत्येक आइटम के लिए प्रस्तुतियों के साथ सबक्लास को परिभाषित करके किया जा सकता है, जिसे मैं डिफ़ॉल्ट_फ्लो_स्टाइल का पालन नहीं करना चाहता, और फिर डंपिंग से पहले उन सभी को आवश्यक रूप से परिवर्तित कर सकता हूं। इस मामले में, इसका मतलब है कि मैं की तरह कुछ मिलता है:

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, आसान से उपयोग dumper.represent_list और dumper.represent_dict अनुमति नहीं देते flow_style निर्दिष्ट करने की, तो मैं टैग निर्दिष्ट करने के लिए है, लेकिन प्रणाली काम करता है।

+0

क्या आपकी टिप्पणी अभी भी 'dumper.represent_sequence' और' dumper.represent_dict' के बारे में अद्यतित है, एक विकल्प flow_style नहीं है? http://pyyaml.org/wiki/PyYAMLDocumentation#Dumper – Hotschke

+0

असल में मैं अनुक्रम पर अपने 'फ्लोमैप' को लागू करने का प्रयास करता हूं: '- किनारों: \ n - [1,2] \ n - [2, 1, [1 , 0]] '। मैं प्रत्येक किनारे को एक अलग लाइन पर रखना चाहता हूं (जैसा कि '\ n' द्वारा दर्शाया गया है)। वर्तमान में, ऐसा लगता है: '- किनारों: \ n - [1,2] \ n - 1 \ n - 2 \ n - [1, 0]' – Hotschke

+0

हां, मेरी टिप्पणी अभी भी मान्य है; 'represent_mapping' में यह है, लेकिन अन्य दो नहीं; वे संभवतः 'represent_mapping' के लिए रैपर हैं। आप जो कर रहे हैं उसके लिए, फ्लोमैप वह नहीं है जो आप चाहते हैं। आप एक अनुक्रम (किनारों के नीचे :) कि आप flow_style = सही होना चाहते हैं, मैपिंग नहीं। – cge