[Python] 项目的配置覆盖与合并

参考来源: https://www.liaoxuefeng.com/wiki/1016959663602400/1018490750237280

 

代码稍微修改了一下

import os
import sys

ps = os.path.abspath(os.path.split(os.path.abspath(os.path.realpath(__file__)))[0])
sys.path.extend([ps])


class Dict(dict):
    """
    Simple dict but support access as x.y style.
    """
    def __init__(self, names=(), values=(), **kw):
        super(Dict, self).__init__(**kw)
        for k, v in zip(names, values):
            self[k] = v

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

    def __setattr__(self, key, value):
        self[key] = value


def merge(defaults, override):
    """
    合并配置
    :param defaults:
    :param override:
    :return:
    """
    r = {}
    for k, v in defaults.items():
        if k in override:
            if isinstance(v, dict):
                r[k] = merge(v, override[k])
            else:
                r[k] = override[k]
        else:
            r[k] = v
    return r


def to_dict(d):
    """
    转换成 dict
    :param d:
    :return:
    """
    dict_building = Dict()
    for k, v in d.items():
        dict_building[k] = to_dict(v) if isinstance(v, dict) else v
    return dict_building


try:
    # 引入默认配置
    from config import config_default
    # 引入覆盖配置
    from config import config_override

    configs = merge(config_default.configs, config_override.configs)
except ImportError:
    config_default = {}
    config_override = {}
    configs = {}
    pass

configs = to_dict(configs)


if __name__ == '__main__':
    print(configs)

 

Have fun with Python!

posted @ 2019-08-23 23:28  DavidHHuan  阅读(444)  评论(0编辑  收藏  举报