You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:32:51