如何从字典/JSON文件中同时调用变量与函数并实现混合输出?
解决混合变量与函数调用的模板输出问题
你的核心问题是%字符串格式化只支持变量替换,无法直接识别并调用函数。这里有两种可行方案,从基础到进阶都能满足需求:
方案一:正则替换+本地命名空间调用函数
这种方法不需要额外依赖,适合简单场景。步骤是先完成变量替换,再通过正则匹配函数名并调用替换:
- 先调整你的函数,让它返回字符串而不是直接
print(因为我们需要把函数结果嵌入到最终输出里,而不是单独打印):
def function_name(): return "This is the function."
- 修改代码,添加正则替换逻辑:
import json import re name = 'John' job = 'student' def function_name(): return "This is the function." with open('json01.json') as json_file: json_dict = json.load(json_file) template = json_dict['test'] # 第一步:替换所有变量 var_processed = template % locals() # 第二步:匹配并替换函数调用(格式为(function_name)) def replace_function(match): func_name = match.group(1) # 从本地命名空间获取函数 target_func = locals().get(func_name) if callable(target_func): # 调用函数(如果需要传参,可以在这里扩展解析逻辑) return target_func() # 如果不是可调用对象,返回原内容 return match.group(0) # 执行正则替换 final_output = re.sub(r'\((\w+)\)', replace_function, var_processed) print(final_output)
运行后就能得到你想要的输出:Hello! student, John, This is the function.
方案二:使用Jinja2模板引擎(更灵活)
如果你的场景后续可能有更复杂的模板需求(比如函数传参、条件判断等),推荐用专业的模板引擎Jinja2,它天然支持变量和函数调用:
- 先安装依赖:
pip install jinja2
- 修改
json01.json里的模板格式为Jinja2语法:
{ "test" : "Hello! {{ job }}, {{ name }}, {{ function_name() }}" }
- 编写Python代码:
import json from jinja2 import Template name = 'John' job = 'student' def function_name(): return "This is the function." with open('json01.json') as json_file: json_dict = json.load(json_file) # 加载模板 template = Template(json_dict['test']) # 渲染模板,传入变量和函数 result = template.render(job=job, name=name, function_name=function_name) print(result)
这种方法更易维护,比如需要给函数传参时,直接在模板里写{{ function_name('hello') }},代码里调整函数接收参数即可。
关键注意点
- 原函数用
print(message)只会输出内容到控制台,不会返回值,所以必须改成return字符串才能嵌入到模板输出中。 - 如果函数需要动态参数,方案一需要扩展正则来解析参数(比如匹配
(func(arg1, arg2))),而方案二可以直接在模板中传递参数,更便捷。
内容的提问来源于stack exchange,提问作者Oslo
相关产品推荐
相关产品推荐

