2011-12-28 10 views
13

में यमल सीरियलाइजेशन ऑर्डर को नियंत्रित करना आप पाइथन शब्दकोश को क्रमबद्ध करते समय पाइयामल आउटपुट/मूल्य जोड़े कैसे ऑर्डर करते हैं?पाइथन

मैं यमल को पाइथन लिपि में एक साधारण धारावाहिक प्रारूप के रूप में उपयोग कर रहा हूं। मेरी यामल सीरियलाइज्ड ऑब्जेक्ट्स "दस्तावेज़" का एक प्रकार प्रस्तुत करती है, इसलिए अधिकतम उपयोगकर्ता-मित्रता के लिए, मैं अपनी ऑब्जेक्ट का "नाम" फ़ील्ड फ़ाइल में पहले दिखाई देना चाहता हूं। बेशक, चूंकि मेरे ऑब्जेक्ट के __getstate__ द्वारा लौटाया गया मान एक शब्दकोश है, और पायथन शब्दकोश अनियंत्रित हैं, इसलिए "नाम" फ़ील्ड को आउटपुट में यादृच्छिक स्थान पर क्रमबद्ध किया जाएगा।

उदा।

>>> import yaml 
>>> class Document(object): 
...  def __init__(self, name): 
...   self.name = name 
...   self.otherstuff = 'blah' 
...  def __getstate__(self): 
...   return self.__dict__.copy() 
... 
>>> doc = Document('obj-20111227') 
>>> print yaml.dump(doc, indent=4) 
!!python/object:__main__.Document 
otherstuff: blah 
name: obj-20111227 
+0

रिकॉर्ड के लिए, वहाँ एक समान प्रश्न (यह एक के बाद कुछ साल पूछा) यहाँ है: http://stackoverflow.com/q/16782112/877069 –

उत्तर

15

मुझे PyYAML डॉक्स और टिकट के माध्यम से खुदाई के कुछ ही घंटों लिया, लेकिन मैं अंत में this comment कि बाहर एक सामान्य YAML नक्शे के रूप में एक OrderedDict serializing (लेकिन व्यवस्था बनाए रखने) के लिए कुछ सबूत अवधारणा-का-कोड देता है की खोज की ।

उदा। अपने मूल कोड के लिए आवेदन किया, समाधान लगता है कि कुछ:

>>> import yaml 
>>> from collections import OrderedDict 
>>> def dump_anydict_as_map(anydict): 
...  yaml.add_representer(anydict, _represent_dictorder) 
... 
>>> def _represent_dictorder(self, data): 
...  if isinstance(data, Document): 
...   return self.represent_mapping('tag:yaml.org,2002:map', data.__getstate__().items()) 
...  else: 
...   return self.represent_mapping('tag:yaml.org,2002:map', data.items()) 
... 
>>> class Document(object): 
...  def __init__(self, name): 
...   self.name = name 
...   self.otherstuff = 'blah' 
...  def __getstate__(self): 
...   d = OrderedDict() 
...   d['name'] = self.name 
...   d['otherstuff'] = self.otherstuff 
...   return d 
... 
>>> dump_anydict_as_map(Document) 
>>> doc = Document('obj-20111227') 
>>> print yaml.dump(doc, indent=4) 
!!python/object:__main__.Document 
name: obj-20111227 
otherstuff: blah 
-7

पिछली बार मैंने चेक किया, पायथन के शब्दकोशों का आदेश नहीं दिया गया था। यदि आप वास्तव में उन्हें बनना चाहते हैं, तो मैं दृढ़ता से कुंजी/मूल्य जोड़े की सूची का उपयोग करने की सलाह देता हूं।

[ 
    ('key', 'value'), 
    ('key2', 'value2') 
] 

वैकल्पिक रूप से, कुंजी के साथ एक सूची परिभाषित करें और उन्हें सही क्रम में रखें।

keys = ['key1', 'name', 'price', 'key2']; 
for key in keys: 
    print obj[key] 
+4

मेरी पोस्ट की तरह कहते हैं, मुझे पता है कि पाइथन शब्दकोश अनियंत्रित हैं। दुर्भाग्यवश, एक शब्दकोश और टुपल्स की एक सूची के बीच यमल पठनीयता में एक बड़ा अंतर है, इसलिए यह मेरे मामले में काम नहीं करेगा। – Cerin