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로 구문 분석하기 쉽습니다.
{'anothersetting2': {'name': ['item', 'item'],
'sub_setting': 'name :[item,item]'},
'setting1': {'name': ['item', 'item'], 'name1': 'text'}}
당신이 얻을 것이다 : 대신, 이제
def omap_constructor(loader, node):
return loader.construct_pairs(node)
yaml.add_constructor(u'!omap', omap_constructor)
: http://pyyaml.org/ticket/29 참조
(('anothersetting2', (('name', ['item', 'item']),
('sub_setting', ('name, [item,item]'),))),
('setting1', (('name', ['item', 'item']), ('name1', 'text'))))
물론 이것은 당신에게 키 - 값 tuple
s의 tuple
을 제공하지만, 당신은 쉽게 construct_ordereddict를 쓸 수 있고 대신 OrderedDict
을 얻을 수 있습니다. 입력뿐만 아니라 출력해야하는 경우 OrdereredDict
객체를 저장하는 표현자를 !omap
으로 쓸 수도 있습니다. 당신이 정말로 그것을 대신 기본 매핑을위한 dict
의 OrderedDict
를 사용하기 위해 PyYAML 후크 할 경우를 고수하려는 경우
, 그것은 이미 파서 객체에서 직접 작업하는 경우 수행 아주 쉽게,하지만 더 어렵다 높은 수준의 편리한 방법. 다행히도 위의 링크 된 티켓에는 사용할 수있는 구현이 있습니다.실제 YAML을 더 이상 사용하지 않고 변종이므로 파일을 처리하는 다른 소프트웨어가 중단 될 수 있으며 가능성이 높습니다.
먼저 이 'PyYAML' 또는 다른 것? 내장 된'yaml' 모듈과'yaml' 모듈을 제공하는 적어도 두 개의 PyPI 패키지는 없습니다. 일반적으로 타사 모듈을 사용할 때마다 어디에서 가져 왔는지 말해야합니다. – abarnert
당신이 사용하고있는 모듈이 무엇이든, 매핑 노드를 파이썬으로 변환하는 방식을 후킹해야하므로'dict' 대신'collection.OrderedDict'를 사용합니다. PyYAML 외에 다른 모듈들과 함께, 나는 잘 모른다. 'PyYAML'으로, 이것은 가능하지만, 당신이 고수준의 편리한 방법을 고수한다면 복잡합니다. 다른 곳에서는 의도 된 고리를 사용하는 것보다 그것을 monkeypatch하는 것이 더 쉬웠다 고 언급 한 사람이 있습니다. – abarnert
이 질문의 제목으로 PyYAML을 사용하면 ... -> PyYAML : yaml.load()에 의해 호출 된 항목의 순서를 제어하십시오. 조언 해 주셔서 감사합니다. – zzart