Files
HeurAMS/src/heurams/services/epath.py
T

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