[Python] 項目的配置覆蓋與合併

參考來源: https://www.liaoxuefeng.com/wiki/1016959663602400/1018490750237280ide

 

代碼稍微修改了一下ui

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!spa

相關文章
相關標籤/搜索