如何使用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)
关键改进说明
- 数据保护:使用
deepcopy创建原字典副本,避免修改原始输入数据 - 上下文合并:将原字典键值与外部
kwargs合并作为模板上下文,kwargs的键会覆盖原字典同名键,兼顾灵活性与默认值 - 递归逻辑:提取
process_value函数统一处理各类值,递归处理嵌套字典时始终传递完整顶层上下文(若需仅使用当前层级上下文,可调整上下文合并逻辑) - 异常处理:捕获
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
相关产品推荐
相关产品推荐

