in easycv/utils/config_tools.py [0:0]
def config_dict_edit(ori_cfg_dict, cfg_dict, reg, dict_mem_helper):
"""
edit ${configs.variables} in config dict to solve dependicies in config
ori_cfg_dict: to find the true value of ${configs.variables}
cfg_dict: for find leafs of dict by recursive
reg: Regular expression pattern for find all ${configs.variables} in leafs of dict
dict_mem_helper: to store the true value of ${configs.variables} which have been found
"""
if isinstance(cfg_dict, dict):
for key, value in cfg_dict.items():
if isinstance(value, str):
var_set = set(reg.findall(value))
if len(var_set) > 0:
n_value = value
is_arithmetic_exp = True
is_exp = True
for var in var_set:
# get the true value for ori_key in cfg_dict
var_value = get_config_class_value(
ori_cfg_dict, var[2:-1], dict_mem_helper)
# while ${variables}, replace by true value directly
if var == value:
is_exp = False
cfg_dict[key] = var_value
break
else:
if isinstance(var_value, str):
# str expression, like '${data_root_path}/images/'
is_arithmetic_exp = False
# arithmetic expression, like '-${img_size}//2'
n_value = n_value.replace(var, str(var_value))
if is_exp:
cfg_dict[key] = eval(
n_value) if is_arithmetic_exp else n_value
# recursively find the leafs of dict
config_dict_edit(ori_cfg_dict, value, reg, dict_mem_helper)
elif isinstance(cfg_dict, list):
for i, value in enumerate(cfg_dict):
if isinstance(value, dict):
# recursively find the leafs of dict
config_dict_edit(ori_cfg_dict, value, reg, dict_mem_helper)
elif isinstance(value, list):
# recursively find the leafs of list
config_dict_edit(ori_cfg_dict, value, reg, dict_mem_helper)
elif isinstance(value, str):
var_set = set(reg.findall(value))
if len(var_set) > 0:
n_value = value
is_arithmetic_exp = True
is_exp = True
for var in var_set:
# get the true value for ori_key in cfg_dict
var_value = get_config_class_value(
ori_cfg_dict, var[2:-1], dict_mem_helper)
# while '${variables}', replace by true value directly
if var == value:
# is not an expression, directly replace
is_exp = False
cfg_dict[i] = var_value
break
else: # arithmetic expression
if isinstance(var_value, str):
# str expression, like '${data_root_path}/images/'
is_arithmetic_exp = False
# arithmetic expression, like '-${img_size}//2'
n_value = n_value.replace(var, str(var_value))
if is_exp:
cfg_dict[i] = eval(
n_value) if is_arithmetic_exp else n_value