YAML仕様では、マッピング内のキーの順序は信頼できない「表現の詳細」であると明確に述べられています。したがって、マッピングに依存している場合、設定ファイルはすでに無効になっています。可能であれば、有効なYAMLを使用することをお勧めします。
もちろん、YAMLは拡張可能であり、設定ファイルに「順序付きマッピング」タイプを追加することを妨げるものは何もありません。例えば:
!omap setting1:
name: [item,item]
name1: text
!omap anothersetting2:
name: [item,item]
!omap sub_setting:
name :[item,item]
yaml
使用しているモジュールについては言及していません。標準ライブラリにはそのようなモジュールはなく、その名前のモジュールを提供するPyPIだけに少なくとも2つのパッケージがあります。ただし、私が知る限り、これが最も人気があるため、PyYAMLだと推測します。
上記の拡張機能は、PyYAMLを使用して簡単に解析できます。http://pyyaml.org/ticket/29を参照してください:
def omap_constructor(loader, node):
return loader.construct_pairs(node)
yaml.add_constructor(u'!omap', omap_constructor)
今、代わりに:
{'anothersetting2': {'name': ['item', 'item'],
'sub_setting': 'name :[item,item]'},
'setting1': {'name': ['item', 'item'], 'name1': 'text'}}
あなたはこれを得るでしょう:
(('anothersetting2', (('name', ['item', 'item']),
('sub_setting', ('name, [item,item]'),))),
('setting1', (('name', ['item', 'item']), ('name1', 'text'))))
もちろん、これによりtuple
Key-Valuetuple
が得られますが、construct_ordereddictを簡単に記述して、OrderedDict
代わりに取得できます。入力だけでなく出力も必要な場合は、OrdereredDict
オブジェクトをsとして格納するリネータを作成することもできます。!omap
本当にPyYAMLをフックして、デフォルトのマッピングのOrderedDict
代わりにを使用するようdict
にしたい場合、パーサーオブジェクトを直接操作している場合は非常に簡単ですが、高レベルの便利なメソッドを使い続けたい場合はさらに困難です。 。幸い、上記のリンクされたチケットには、使用できる実装があります。実際のYAMLを使用しているのではなく、バリアントを使用していることを覚えておいてください。そのため、ファイルを処理する他のソフトウェアは破損する可能性があり、おそらく破損する可能性があります。