Python中的Yaml合并

Posted

技术标签:

【中文标题】Python中的Yaml合并【英文标题】:Yaml merge in Python 【发布时间】:2010-10-23 19:38:27 【问题描述】:

所以我正在玩弄让自己(当然还有任何关心使用它的人)在 Python 中为 Pygame 制作一个小样板库的想法。我想要一个系统,其中应用程序的设置随 yaml 文件一起提供。

所以我想如果库提供一个默认的 yaml 树并将它与用户提供的树合并它会很有用。为了可用性起见,我想知道是否有任何人可以预测一个例程:

在树中用户提供的 yaml 与默认值重叠的任何情况下,用户提供的分支都会替换库提供的分支。

在用户提供的 yaml 不与默认树重叠的任何情况下,默认树仍然存在。

用户提供的 yaml 提供的树中的任何多余分支都会被附加。

我知道这个解释很冗长,因为我的要求可能很清楚。我想知道免费获得是不是有点多。

【问题讨论】:

它应该如何处理冲突的类型,例如默认树中的列表和配置树中的字典?它应该合并列表吗?在这种情况下,如何合并? 【参考方案1】:

您可以使用PyYAML 解析文件,然后使用以下函数合并两棵树:

def merge(user, default):
    if isinstance(user,dict) and isinstance(default,dict):
        for k,v in default.iteritems():
            if k not in user:
                user[k] = v
            else:
                user[k] = merge(user[k],v)
    return user

或者,您可以在调用此函数之前对用户树进行deep-copy。

【讨论】:

它是 default.update(user),因为 dict.update 会覆盖现有的键。要知道在哪里更深地递归到树中,我必须遍历连接的字典,它大于或等于最大的用户和默认值。 非常好,谢谢!尽管恕我直言,它错过了数组之间的合并:如果一个键具有 [1,2] 而另一个键具有 [2,3],则合并的元素应该具有 [1,2,3]。我错了吗? 那么你将不得不处理重复和复杂的对象相等性。 这不处理用户文件为空的情况。在这种情况下,user 将是 None 那只是根级别的,应该在调用merge之前处理。将user 中的现有分支替换为不带值的分支是错误的,对应于defaultmerge("yamlkey:", "yamlkey:3")

以上是关于Python中的Yaml合并的主要内容,如果未能解决你的问题,请参考以下文章

合并 PR 后如何限制 Azure DevOps YAML 管道中的关联工作项?

将 YAML 文件中的列表传递给 python

使用 Python 更改 yaml 文件中的值

谁应该被认为是 pubspec.yaml 中的作者?

使用python访问yaml中的元素

将 YAML 加载为嵌套对象而不是 Python 中的字典