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

如何使用Python Template递归以字典自身为模板替换变量值?

递归使用Python Template替换字典中的变量值

问题分析

需要实现通用的递归模板替换功能:利用string.Template将字典内的字符串值替换为字典自身(或外部传入)的变量值,同时支持嵌套字典的递归处理。原代码存在以下问题:

  • 直接修改传入的原字典,导致原数据被污染
  • 模板上下文未纳入字典自身的键值对,仅使用外部kwargs
  • 递归调用时未传递完整的模板上下文
  • 存在语法错误(函数调用缺少闭合括号)

通用实现方案

from string import Template
from copy import deepcopy

def recursive_template(d, **kwargs):
    # 合并模板上下文:外部kwargs优先级高于原字典的同名键
    context = deepcopy(d)
    context.update(kwargs)
    
    def process_value(value):
        if isinstance(value, str):
            try:
                return Template(value).substitute(context)
            except KeyError:
                # 变量不存在时返回原字符串,可根据需求改为抛出异常
                return value
        elif isinstance(value, dict):
            # 递归处理嵌套字典,传递完整顶层上下文
            return {k: process_value(v) for k, v in value.items()}
        else:
            # 非字符串、字典类型直接返回原值
            return value
    
    # 返回处理后的新字典,不修改原输入字典
    return process_value(d)

关键改进说明

  1. 数据保护:使用deepcopy创建原字典副本,避免修改原始输入数据
  2. 上下文合并:将原字典键值与外部kwargs合并作为模板上下文,kwargs的键会覆盖原字典同名键,兼顾灵活性与默认值
  3. 递归逻辑:提取process_value函数统一处理各类值,递归处理嵌套字典时始终传递完整顶层上下文(若需仅使用当前层级上下文,可调整上下文合并逻辑)
  4. 异常处理:捕获KeyError,避免因变量不存在导致程序崩溃,可根据业务需求调整异常处理策略

测试示例

config_dict = {
    'dataPath': '/home/work/Users/',
    'dataLoc': '${dataPath}inst/extdata/',
    'nested': {
        'subPath': '${dataPath}sub/',
        'other': 'fixed_value'
    }
}

# 基础替换:使用字典自身变量
result = recursive_template(config_dict)
print(result)

# 外部变量覆盖:传入kwargs替换原变量
result_override = recursive_template(config_dict, dataPath='/new/storage/')
print(result_override)

输出结果

基础替换输出:

{
    'dataPath': '/home/work/Users/',
    'dataLoc': '/home/work/Users/inst/extdata/',
    'nested': {
        'subPath': '/home/work/Users/sub/',
        'other': 'fixed_value'
    }
}

外部覆盖输出:

{
    'dataPath': '/home/work/Users/',
    'dataLoc': '/new/storage/inst/extdata/',
    'nested': {
        'subPath': '/new/storage/sub/',
        'other': 'fixed_value'
    }
}

内容的提问来源于stack exchange,提问作者Harlan Nelson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:19:31