from heurams.services.config import ConfigDict from heurams.services.logger import get_logger logger = get_logger(__name__) def epath( dct, path: str = "", default=None, parents=False, enable_modify=False, new_value=None, ): if not path: return dct path = path.rstrip(".") path = path.lstrip(".") target = dct keys = path.split(".") logger.debug(f"处理 EPATH {path}, {new_value}") for idx, i in enumerate(keys): is_last = idx == len(keys) - 1 # 处理字典键 logger.debug( f"处理 {i}, {(isinstance(target, dict) or isinstance(target, ConfigDict))} {i in target}" ) if is_last and enable_modify: # 最后一次循环执行修改 if isinstance(target, dict) or isinstance(target, ConfigDict): target[i] = new_value return new_value elif ( i.startswith("[") and i.endswith("]") and isinstance(target, (list, tuple)) ): idx_num = int(i[1:-1]) if 0 <= idx_num < len(target): target[idx_num] = new_value return new_value elif parents: while len(target) <= idx_num: target.append(None) target[idx_num] = new_value return new_value else: return default else: return default else: if ( isinstance(target, dict) or isinstance(target, ConfigDict) ) and i in target: target = target[i] elif ( i.startswith("[") and i.endswith("]") and isinstance(target, (list, tuple)) ): idx_num = int(i[1:-1]) if 0 <= idx_num < len(target): target = target[idx_num] elif parents: while len(target) <= idx_num: target.append(None) target[idx_num] = {} target = target[idx_num] else: return default elif parents: target[i] = {} target = target[i] else: return default return target