我正在构建一个JSON令牌替换器,其工作原理如下:
输入:{"greet": "hello {{name}}"}
和 token {"name": "Lorenzo"}
输出:{"greet": "hello Lorenzo"}
由于我希望该函数也适用于嵌套的字典/列表,因此我使用了递归来扩展更复杂的输入的功能,例如:
输入:{"a": {"b": "x{{ppp}}z"}}
和 token {"ppp": "y"})
输出:{"a": {"b": "xyz"}}
(其他测试/示例用法可用here个)
即使代码可以工作,我也不满意我当前的解决方案,因为我违反了DRY原则.
我相信我可以让我的代码更干净:有什么 idea 或建议吗?这就是我try 过的:
def __replace(input_str: str, pytokens: dict):
for k, v in pytokens.items():
input_str = re.sub("{{" + k + "}}", str(v), input_str)
return input_str
def __json_replacer(pyinput, pytokens: dict):
# TODO DRY: code is doubled, code this part again
if isinstance(pyinput, str):
return __replace(pyinput, pytokens)
if isinstance(pyinput, list):
for i in range(len(pyinput)):
pyinput[i] = __json_replacer(pyinput[i], pytokens)
return pyinput
if not isinstance(pyinput, dict):
return pyinput
res = {}
for k, v in pyinput.items():
if isinstance(v, str):
v = __replace(v, pytokens)
if isinstance(v, list):
for i in range(len(v)):
v[i] = __json_replacer(v[i], pytokens)
if isinstance(v, dict):
v = __json_replacer(v, pytokens)
res[k] = v
return res
注意:该项目是开源的!如果您提供解决方案,请随意打开公关并获得积分:)GitHub project link