Python递归JSON令牌替换函数存代码重复,如何遵循DRY原则优化?
优化JSON令牌替换工具的代码结构(符合DRY原则)
我正在开发一款JSON令牌替换工具,核心功能是将输入JSON中的{{令牌名}}格式占位符替换为对应令牌值:
- 基础场景:输入
{"greet": "hello {{name}}"}和令牌{"name": "Lorenzo"},输出{"greet": "hello Lorenzo"} - 嵌套场景:支持嵌套字典/列表的递归处理,比如输入
{"a": {"b": "x{{ppp}}z"}}和令牌{"ppp": "y"},输出{"a": {"b": "xyz"}}
当前代码可正常运行,但存在重复逻辑,违反DRY原则,需要优化。以下是原实现代码:
import re 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
优化方案
核心思路是让字典处理逻辑直接复用已有的递归逻辑,无需单独判断值的类型再重复处理,因为__json_replacer本身已经能处理所有类型(字符串、列表、字典、其他类型)。
优化后的代码:
import re 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): if isinstance(pyinput, str): return __replace(pyinput, pytokens) if isinstance(pyinput, list): return [__json_replacer(item, pytokens) for item in pyinput] if isinstance(pyinput, dict): return {k: __json_replacer(v, pytokens) for k, v in pyinput.items()} # 非字符串、列表、字典的类型直接返回 return pyinput
优化说明
- 列表处理改用列表推导式,更简洁且避免原地修改原列表
- 字典处理通过字典推导式,对每个值递归调用
__json_replacer,彻底复用了已有的类型判断逻辑,消除了重复代码 - 去掉冗余的类型判断分支,逻辑更清晰,完全符合DRY原则
内容的提问来源于stack exchange,提问作者Lorenzo Mogicato
相关产品推荐
相关产品推荐

