Jinja2模板用列表推导式报expected token ','错误但Python正常如何解决
Jinja2语法报错解决方法
报错原因
Jinja2的表达式语法对原生Python的嵌套生成器支持有限,你代码中dict(item.split("=") for item in item.split(","))里的生成器表达式item.split("=") for item in item.split(",")不符合Jinja2语法规范,因此抛出expected token ',', got 'for'错误。
同时你原有代码中多层循环复用同一个变量名item,也存在变量作用域覆盖的隐患。
可行实现方案
方案1:拆分逻辑(可读性更高)
用Jinja2内置的map过滤器实现键值对拆分,拆分后的逻辑和你原生Python的效果完全一致:
{% set input_str = "studId=ValueA,studName=valueB;studId=ValueC,studName=ValueD" %} {% for stud_item in input_str.split(";") %} {% set stud = dict(stud_item.split(",") | map("split", "=") | list) %} {{ stud.studName }} {% endfor %}
运行后输出结果:
valueB ValueD
方案2:一行列表推导写法
如果你需要保留列表推导的写法,将内部的生成器替换为Jinja2支持的过滤器写法即可:
{% set input_str = "studId=ValueA,studName=valueB;studId=ValueC,studName=ValueD" %} {% for stud in [dict(g.split(",")|map("split", "=")|list) for g in input_str.split(";")] %} {{ stud.studName }} {% endfor %}
两种方案都可以实现和你原生Python代码完全相同的解析遍历效果。
建议优先使用方案1,嵌套逻辑拆分后更易调试和维护
内容的提问来源于stack exchange,提问作者josh
相关产品推荐
相关产品推荐

