आप शायद, 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
उदाहरण का प्रतिनिधित्व करने के लिए स्थैतिक विधि को बुलाया जाता है।
मुझे लगभग निश्चित है कि पुस्तकालय के प्रमुख हिस्सों को अनिवार्य रूप से पुनर्लेखन करने और टिप्पणियों को संभालने के तरीके के बारे में कई निर्णय लेने के लिए PyYAML के साथ ऐसा करने का कोई तरीका नहीं है। क्या आप प्रतिनिधित्वकर्ता द्वारा जोड़ा गया टिप्पणियां चाहते हैं (उदाहरण के लिए, प्रति-वर्ग)? या प्रति उदाहरण किसी भी तरह (यहां तक कि कठिन)? यह कुछ दुर्भाग्यपूर्ण है, क्योंकि टिप्पणियां जोड़ने की क्षमता कुछ हद तक उपयोगी हो सकती है। – cge
धन्यवाद @cge। Yaml दस्तावेजों को प्रोग्रामेटिक रूप से संसाधित करते समय टिप्पणियां संरक्षित करना बहुत उपयोगी होगा। –
http://www.dzone.com/snippets/pyyaml-comment-emitter यह समझने लगता है कि ईवेंट/डम्पर इंटरफेस का उपयोग करके इसे कैसे किया जाए। अभी तक एक उत्तर के रूप में पोस्ट नहीं कर रहा है क्योंकि मैंने इसे अभी तक काम करने के लिए सत्यापित नहीं किया है। – kampu