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

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

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

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

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

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

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

【问题讨论】:

  • 它应该如何处理冲突的类型,例如默认树中的列表和配置树中的字典?它应该合并列表吗?在这种情况下,如何合并?

标签: python configuration 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")
猜你喜欢
  • 2018-05-05
  • 2021-07-23
  • 1970-01-01
  • 2021-03-25
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多