环境配置
pip install easydict
pip install pyyaml
基本用法
gdict = dict()
gdict[1] = 1
gdict[2.3] = 2.3
gdict['4'] = '4'
2.3 in gdict
Out[17]: True
gdict[2.3]
Out[18]: 2.3
from easydict import EasyDict as edict
tdict = edict()
tdict['sss'] = 'sss'
tdict.ttt = 'ttt'
'sss' in tdict
Out[24]: True
'ttt' in tdict
Out[25]: True
tdict['sss'], tdict['ttt'], tdict.sss, tdict.ttt
Out[26]: ('sss', 'ttt', 'sss', 'ttt')
isinstance(gdict, dict), isinstance(gdict, edict)
Out[31]: (True, False)
isinstance(tdict, dict), isinstance(tdict, edict)
Out[32]: (True, True)
实例
NORMALIZE: True
DATASET:
NAME:
A: 8
B: 9
from easydict import EasyDict as edict
import yaml
def _update_dict(cfg, value, only_update=False, keep_normal=[]):
"""
将源edict更新到目的edict
:param cfg: 目的edict对象
:param value: 源edict对象
:param only_update: 仅更新不插入,不存在k时报错
:param keep_normal: 当k in keep_normal,则将v直接赋值给cfg[k](即使v为edict)
:return:
"""
for k, v in value.items():
if only_update:
if k not in cfg:
raise ValueError("{} not exist in config.py".format(k))
else:
if isinstance(v, edict) and k not in keep_normal:
_update_dict(cfg[k], v, only_update, keep_normal)
else:
cfg[k] = v
else:
if isinstance(v, edict) and k not in keep_normal:
if k not in cfg:
cfg[k] = edict()
_update_dict(cfg[k], v, only_update, keep_normal)
else:
cfg[k] = v
def update_config(cfg, config_file, only_update=False, keep_normal=[]):
"""
将配置文件更新到cfg
:param cfg: 目的edict对象
:param config_file: yaml文件路径
:param only_update: 仅更新不插入,不存在k时报错
:param keep_normal: 当k in keep_normal,则将v直接赋值给cfg[k](即使v为edict)
:return:
"""
with open(config_file) as f:
exp_config = edict(yaml.load(f, Loader=yaml.FullLoader))
_update_dict(cfg, exp_config, only_update, keep_normal)
cfg = edict()
update_config(cfg, 'ttt.yaml')
print(cfg)
cfg = edict()
cfg.NORMALIZE = None
cfg.DATASET = edict()
cfg.DATASET.NAME = edict()
cfg.DATASET.NAME.A = None
cfg.DATASET.NAME.B = None
update_config(cfg, 'ttt.yaml', only_update=True)
print(cfg)
cfg = edict()
cfg.NORMALIZE = None
cfg.DATASET = None
update_config(cfg, 'ttt.yaml', only_update=True, keep_normal=['DATASET'])
print(cfg)