jinja模板变量赋值作用域

3 投票
1 回答
4776 浏览
提问于 2025-04-17 14:56

给定以下的Jinja代码片段

        {% set sep='' %}                
        {% for stamp in stamp_list -%}
            {%- for heartbeat in heartbeat_list -%}
                {%- if heartbeat.name == site.name and heartbeat.stamp == stamp.stamp -%}
                    {{- heartbeat.sc_time -}}
                    {{- sep -}}
                    {% set sep=',' %}
                                            [PROOF for new value {{ sep }}]
                {%- endif -%}
            {%- endfor -%}
        {%- endfor %}

看看这个sep变量(是separator的缩写),我想用逗号把sc_time分开,比如像3.13,2.5,1.33,...这样。

所以我引入了这个sep变量,并在内部的if语句中进行了修改。看这个Jinja的文档,我没有看到关于在for循环或if语句内部的作用域的说明,确实我可以使用并改变sep变量... 在这个例子中,

             {% set sep=',' %} 

这一行被执行了,接下来的这一行

             [PROOF ... 

实际上会显示出逗号,但是,下次

             {{- sep -}} 

又会渲染成一个空变量。我到底漏掉了什么,或者说我哪里没理解清楚呢……

1 个回答

2

问题在于变量的作用域。你在循环里的 sep 变量被认为是一个新的变量,而不是你在最开始定义的那个变量。

这里有同样的问题和一些回答,可以参考一下:Jinja 变量的作用域能否在内部块中扩展?

撰写回答