81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
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
|