PyYaml

2012-11-22 14 views
13

के साथ उत्पादित YAML को टिप्पणियां जोड़ना मैं Pyyaml ​​का उपयोग कर अपने स्वयं के अजगर वस्तुओं से यम दस्तावेज़ बना रहा हूं। उदाहरण के लिए मेरी वस्तु: PyYaml

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

हो जाता है:

boby: 
    age: 34 

अब तक तो अच्छा।

लेकिन अब यह कैसा दिखाई देगा मैं एक तरह से प्रोग्राम के रूप में उत्पादित YAML के लिए टिप्पणी जोड़ने के लिए नहीं मिला है:

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

कोड पर PyYaml प्रलेखन को देखते हुए और यह भी, मैं ऐसा करने का कोई रास्ता मिल गया।

कोई सुझाव?

+0

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

+0

धन्यवाद @cge। Yaml दस्तावेजों को प्रोग्रामेटिक रूप से संसाधित करते समय टिप्पणियां संरक्षित करना बहुत उपयोगी होगा। –

+0

http://www.dzone.com/snippets/pyyaml-comment-emitter यह समझने लगता है कि ईवेंट/डम्पर इंटरफेस का उपयोग करके इसे कैसे किया जाए। अभी तक एक उत्तर के रूप में पोस्ट नहीं कर रहा है क्योंकि मैंने इसे अभी तक काम करने के लिए सत्यापित नहीं किया है। – kampu

उत्तर

4

आप शायद, MyObj वर्ग के लिए कुछ representer है PyYAML के साथ डिफ़ॉल्ट डंपिंग (print(yaml.dump(MyObj()))) द्वारा के रूप में आप दे देंगे:

!!python/object:__main__.MyObj {} 

PyYAML केवल अपनी वांछित उत्पादन में टिप्पणी के साथ एक बात कर सकते हैं: उन्हें त्यागने । आप पीठ में है कि वांछित आउटपुट पढ़ता था, तो आप अंत एक dict एक dict युक्त के साथ

कि मैं विकसित PyYAML के लिए उन्नत संस्करण ({'boby': {'age': 34}}, आप एक MyObj() उदाहरण कोई टैग जानकारी न होने के कारण नहीं मिलेगा) (ruamel.yaml) टिप्पणियों के साथ वाईएएमएल में पढ़ सकते हैं, टिप्पणियों को संरक्षित कर सकते हैं और डंपिंग करते समय टिप्पणियां लिख सकते हैं। यदि आप अपना वांछित आउटपुट पढ़ते हैं, तो परिणामस्वरूप डेटा एक धैर्य वाले एक निर्देश की तरह (और कार्य) देखेंगे, लेकिन वास्तव में वहां अधिक जटिल डेटा संरचना है जो टिप्पणियों को संभाल सकती है। हालांकि आप उस संरचना को बना सकते हैं जब ruamel.yaml आपको MyObj का उदाहरण डंप करने के लिए कहता है और यदि आप उस समय टिप्पणियां जोड़ते हैं, तो आपको वांछित आउटपुट मिल जाएगा।

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) 

कौन सा प्रिंट:

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

CommentedMap उदाहरणों बनाने जब तक आप MyObj उदाहरण का प्रतिनिधित्व करना चाहते हैं के साथ प्रतीक्षा करने के लिए कोई जरूरत नहीं है। मैं उदा। name और age उन गुणों में करें जो एप्रोप्रेट CommentedMap से/मानों को प्राप्त/सेट करते हैं। yaml_representer से पहले आप आसानी से टिप्पणियां जोड़ सकते हैं MyObj उदाहरण का प्रतिनिधित्व करने के लिए स्थैतिक विधि को बुलाया जाता है।

संबंधित मुद्दे