首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用ruamel CommentedMap()手动添加项

使用ruamel CommentedMap()手动添加项
EN

Stack Overflow用户
提问于 2018-10-25 09:25:34
回答 1查看 808关注 0票数 1

作为我上一个[Loading and dumping multiple yaml files with ruamel.yaml (python)](https://stackoverflow.com/questions/52943337/loading-and-dumping-multiple-yaml-files-with-ruamel-yaml-python问题的后续,我现在尝试将条目插入到树中。我使用CommentedMaps(),这样我也可以在树中插入自己的锚/引用。

代码的相关部分:如果还没有用户: tree,我创建如下:

代码语言:javascript
运行
复制
if 'users' not in merged_yaml:
    merged_yaml['users'] = [ CommentedMap() ]
    merged_yaml['users'][0].yaml_set_anchor('users')

然后添加它们,就像

代码语言:javascript
运行
复制
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地图中。

代码语言:javascript
运行
复制
[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)
     ]))
    ])
]

我一直在努力找出我做错了什么,但我找不到。

代码语言:javascript
运行
复制
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'

我期待的是:

代码语言:javascript
运行
复制
[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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-25 10:39:43

您只在配额行之后保留),从而手动包装“)”。如果您对"user2“的配额行做了同样的操作,并且将"user3”的配额放在换行符上,您将看到缩进会使您在解释输出时失去平衡。

代码语言:javascript
运行
复制
[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追加到列表中:

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52985851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档