Python / JSON:合并默认设置和用户配置

我在python应用程序中使用JSON配置文件。我想要具有分层结构的默认配置。
用户配置中只能包含与默认设置不同的参数。我当前的解决方案是:

# default.json
{
    "parA" : 1,
    "parB" : {
       "sparA" : 0,
       "sparB" : 1
    }
}`

# user.json
{
    "parB" : {
       "sparB" : 9
    }
}

配置由加载

default_json = open("default.json")
default_config = json.load(default_json)
default_json.close()


user_json = open("user.json")
user_config = json.load(user_json)
user_json.close()  

config = default_config.copy()
config.update(user_config)

问题在于,整个密钥“ parA”被覆盖,因此“ sparA”被删除。是否有一种简单的方法可以只覆盖子键,而不能覆盖整个父键?

亚历克斯·马特利

可以做到,尽管有点微妙。以下内容假定结构兼容(例如,您不尝试将非字典合并为字典等),并且在非字典的情况下,“合并”是一个简单的替换。

它还假定可以就地修改基础对象(既然如此,因为无论如何都要更新副本,所以看起来是这样;如果后者不是这种情况,那就没什么大不了的,base_obj = dict(base_obj)只需在该对象之前添加一个复制语句即可)。for循环)...:

def selective_merge(base_obj, delta_obj):
    if not isinstance(base_obj, dict):
        return delta_obj
    common_keys = set(base_obj).intersection(delta_obj)
    new_keys = set(delta_obj).difference(common_keys)
    for k in common_keys:
        base_obj[k] = selective_merge(base_obj[k], delta_obj[k])
    for k in new_keys:
        base_obj[k] = delta_obj[k]
    return base_obj

此作品为您给出的例子,但将打破,如果如你给出default.jsonuser.json是,比如说,'{"parB": 23}'(合并非字典入字典违反结构相容约束;我不知道你有什么在这样的情况发生一件事)。

因此,一旦您将功能调整到符合您的具体规格,您所需要做的就是替换给定代码中的代码,

config.update(user_config)

config = selective_merge(config, user_config)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章