おそらくもっと良い解決策がありますが、ドキュメントやソースで何も見つかりませんでした。
のPython 2(コメントを参照してください)
私はOrderedDict
をサブクラス化し、それがunsortable項目のリストを返す作っ:
from collections import OrderedDict
class UnsortableList(list):
def sort(self, *args, **kwargs):
pass
class UnsortableOrderedDict(OrderedDict):
def items(self, *args, **kwargs):
return UnsortableList(OrderedDict.items(self, *args, **kwargs))
yaml.add_representer(UnsortableOrderedDict, yaml.representer.SafeRepresenter.represent_dict)
そして、動作するようです:
>>> d = UnsortableOrderedDict([
... ('z', 0),
... ('y', 0),
... ('x', 0)
... ])
>>> yaml.dump(d, default_flow_style=False)
'z: 0\ny: 0\nx: 0\n'
のPython 3または2(コメントを参照してください)
私はそれからいくつかのスタイルのチェックコードを取り除かとして、あなたはまた、カスタムrepresenterを書くことができますが、後で問題に実行されます場合、私は知りません:
import yaml
from collections import OrderedDict
def represent_ordereddict(dumper, data):
value = []
for item_key, item_value in data.items():
node_key = dumper.represent_data(item_key)
node_value = dumper.represent_data(item_value)
value.append((node_key, node_value))
return yaml.nodes.MappingNode(u'tag:yaml.org,2002:map', value)
yaml.add_representer(OrderedDict, represent_ordereddict)
しかし、これでネイティブOrderedDict
クラスを使用できます。
ソースを見ると強制的にdictをソートするように見えるので、 'yaml.add_representer'を呼び出すことはできません。 – Blender