Jinja2嵌套循环中如何正确使用if not loop.last处理逗号
Jinja2双层循环末尾逗号处理方案
问题场景
给定两个数组:
a = [a1, a2] b = [b1, b2]
期望生成笛卡尔积形式的结构,每个元素后带逗号(最后一个元素除外):
{ {a1, b1}, {a1, b2}, {a2, b1}, {a2, b2} }
原代码仅判断内层循环的loop.last,导致内层循环结束后(非最后一个外层元素时)缺失逗号:
{ {% for a in as %} {% for b in bs %} {a,b} {{"," if not loop.last}} {% endfor %}{% endfor %} }
实际错误输出:
{ {a1, b1}, {a1, b2} {a2, b1}, {a2, b2} }
解决方案
可以通过结合外层循环和内层循环的loop.last状态来判断,仅当双层循环同时处于最后一项时不添加逗号,其余情况均添加逗号。
修改后的Jinja2代码:
{ {% for a in as %} {% for b in bs %} {a,b} {{ "," if not (loop.parent.loop.last and loop.last) }} {% endfor %} {% endfor %} }
逻辑说明
loop.parent.loop用于获取外层循环的loop对象,loop.parent.loop.last表示当前是否处于外层循环的最后一项loop.last表示当前是否处于内层循环的最后一项- 当两者同时为
True时,说明是整个双层循环的最后一个元素,此时不添加逗号;其余所有情况都添加逗号,即可得到符合预期的输出结构。
内容的提问来源于stack exchange,提问作者Methil
相关产品推荐
相关产品推荐

