作为我之前的[Loading and dumping multiple yaml files with ruamel.yaml (python)问题的跟进),我现在尝试将项目插入树中。我正在使用CommentedMaps()
,因此也可以在树中插入自己的锚点/引用。
代码的相关部分: 如果没有用户:树还存在,我创建这个:
if 'users' not in merged_yaml:
merged_yaml['users'] = [ CommentedMap() ]
merged_yaml['users'][0].yaml_set_anchor('users')
然后将其添加为
merged_yaml['users'][0][user_name] = CommentedMap({'timestamp': current_date}, relax=True)
merged_yaml['users'][0][user_name].add_yaml_merge([(0, userdefaults)])
因此,尽管这样做有效,但结果却不一致,如您所见(
pprint(merged_yaml['users'])
-手动缩进)。问题在于user3被合并到user2的地图内。
[ordereddict([
('user1', ordereddict([
('timestamp', '2018-10-25 11:16:42.132415'),
('files', 1000),
('quota', 200)
])),
('user2', ordereddict([
('timestamp', '2018-10-25 11:16:42.132415'),
('files', 1000),
('quota', 200)
])),
('user3', ordereddict([
('timestamp', '2018-10-25 11:16:42.132415'),
('files', 1000),
('quota', 200)
]))
])
]
我一直在试图找出我在做什么错,但我无法发现它。
users:
- user1:
<<: *userdefaults
timestamp: '2018-10-25 11:16:42.132415'
user2:
<<: *userdefaults
timestamp: '2018-10-25 11:16:42.132415'
user3:
<<: *userdefaults
timestamp: '2018-10-25 11:16:42.132415'
我期望的是:
[ordereddict([
('user1', ordereddict([
....
]))
]),
ordereddict([
('user2', ordereddict([
....
]))
])
]
users:
- user1:
<<: *userdefaults
timestamp: '2018-10-25 11:16:42.132415'
- user2:
<<: *userdefaults
timestamp: '2018-10-25 11:16:42.132415'
- user3:
<<: *userdefaults
timestamp: '2018-10-25 11:16:42.13241
答案 0 :(得分:1)
您只在配额行之后留了)
来手动包装“ user1”。
如果您对“ user2”的配额行执行相同的操作,并且还将“ user3”的配额放在换行符上,则会看到缩进
在解释输出时会使您失去平衡。
[ordereddict([
('user1', ordereddict([
('timestamp', '2018-10-25 11:16:42.132415'),
('files', 1000),
('quota', 200)
])),
# ^ closing for tuple
# ^ closing for ordereddict
# ^ closing for list of ordereddict tuples
('user2', ordereddict([
('timestamp', '2018-10-25 11:16:42.132415'),
('files', 1000),
('quota', 200)
])),
('user3', ordereddict([
('timestamp', '2018-10-25 11:16:42.132415'),
('files', 1000),
('quota', 200)
]))
# ^^^^ extra indent in 5 preceding lines
])
]
基于期望的输出,您希望每个序列元素一个映射,而您的序列具有多个元素。为此,在Python中,您需要将CommentedMap
附加到列表中:
merged_yaml['users'] = x = []
for user in users:
cm = CommentedMap()
cm[user] = CommentedMap({'timestamp': current_date}, relax=True)
cm.add_yaml_merge([(0, userdefaults)])
x.append(cm)