얼마 전까지 만해도 question과 비슷한 질문을했지만 YAML 덤프에 참조를 추가하는 방법에 대해 여전히 혼란 스럽습니다.ruamel.yaml에 참조를 자동으로 추가하는 방법은 무엇입니까?
내 목표는 내 덤프의 중복을 최소화하기 위해 기본값에 앵커를 추가하는 것입니다.
---
~: &default
a: 1
c: 3
b: 2
[1, 2, 3, 4]:
1:
<<: *default
a: 10
2:
<<: *default
b: 20
[5, 6, 7, 8]:
1:
<<: *default
2:
<<: *default
a: 100
c: 300
b: 200
그리고 내가 무엇을 얻을 것은 :
import collections
import ruamel.yaml as yaml
default = {'a': 1, 'b': 2, 'c': 3}
data = {
(1,2,3,4): {1: {'a': 10}, 2: {'b': 20}},
(5,6,7,8): {1: {}, 2: {'a': 100, 'b': 200, 'c': 300}},
}
d = yaml.comments.CommentedMap()
d.update(default)
d.yaml_set_anchor('default')
default = d
for m, a in data.items():
for k in a.keys():
u = yaml.comments.CommentedMap()
u.update(a[k])
u.add_yaml_merge([(0, default)])
a[k] = u
data[None] = default
def my_key_repr(self, data):
if isinstance(data, tuple):
return self.represent_sequence(u'tag:yaml.org,2002:seq', data, flow_style=True)
return yaml.representer.SafeRepresenter.represent_key(self, data)
yaml.representer.RoundTripRepresenter.represent_key = my_key_repr
print yaml.dump(data, Dumper=yaml.RoundTripDumper, width=100, allow_unicode=True,
explicit_start=True)
예상 출력은 다음과 같습니다 거기 *id001
은 어디에서 오는
---
?
: &default
a: 1
c: 3
b: 2
[1, 2, 3, 4]:
1:
<<: *default
a: 10
2:
<<: *default
b: 20
&id001 [5, 6, 7, 8]:
1:
<<: *id001
2:
<<: *id001
a: 100
c: 300
b: 200
...
'abc' 대신 실제로'[1, 2, 3, 4]'를 키로 쓰려면 yaml.comments.CommentedSeq ((1, 2, 3, 4))'. 'CommentedSeq()'에 대한 인수는리스트가 될 수 있으며, 그 값은 생성시 복사됩니다. – Anthon