Jinja2中如何动态引用拼接变量名对应的变量值?
Jinja2 动态引用变量实现方案
问题说明
目标是通过动态拼接生成的变量名,获取对应变量的实际值,初始写法无法达到预期:
{%- set varA = 5 -%} {%- set varB = 10 -%} {%- set input = 'A' -%} {%- set output = 'var' + input -%} Output: {{ output }} {# 实际输出为"Output: varA",预期输出为"Output: 5" #}
当同前缀变量数量较多(如varA到varZ共26个变量)时,if/else多分支判断的写法冗余度极高:
{%- if input == 'A' -%} {%- set output = varA -%} {%- else -%} {%- set output = varB -%} {%- endif -%} Output: {{ output }}
尝试通过宏返回拼接后的变量名,仅能得到字符串类型的变量名,无法解析为对应变量的实际值:
{%- macro doit(input) -%} var{{input}} {%- endmacro -%} {%- set output = doit(input) -%} Output: {{ output }} {# 返回结果为"Output: varA" #}
可行方案
Jinja2 渲染过程中,当前作用域内的所有局部变量、全局变量、宏等内容都存储在内置的context对象中,直接通过动态拼接的键名从该对象取值即可,无需编写冗余分支:
{%- set varA = 5 -%} {%- set varB = 10 -%} {%- set input = 'A' -%} {# 推荐用~做字符串拼接,会自动将操作数转为字符串,兼容性优于+ #} {%- set output = context['var' ~ input] -%} Output: {{ output }} {# 输出:Output: 5,符合预期 #}
如果拼接出的变量名可能不存在,可以搭配default过滤器设置兜底值,避免渲染报错:
{%- set output = context['var' ~ input] | default(0) -%}
若变量为全局注册的变量,也可通过globals()对象取值,但context覆盖范围包含当前作用域的所有可访问内容,适用场景更广,优先选择该方式。
原有方案失效原因
- 直接拼接得到的结果是普通字符串,Jinja2 不会自动将字符串内容识别为变量名做二次解析
- 宏的返回值是模板渲染后的字符串结果,不会触发变量求值逻辑,因此无法获取对应变量的实际值
内容的提问来源于stack exchange,提问作者rtenha
相关产品推荐
相关产品推荐

