Jinja模板递归遍历字典报错:预期2个值解包却得到1个
Jinja递归遍历字典报错问题解决
我在Jinja模板实现递归遍历字典时遇到报错,相关代码及错误信息如下:
Python脚本
from pathlib import Path from jinja2 import Environment, FileSystemLoader path = Path(__file__).parent env = Environment( loader=FileSystemLoader(path / "templates") ) template = env.get_template("template1.rst") rendered = template.render(sample={"a": {"b": "c"}})
Jinja模板(template1.rst)
.. toctree:: :maxdepth: 3 {% for k, v in sample.items() recursive %} - {{ k }}: {%- if v is string %} {{ v }} {%- else %} {{ loop(v) }} {%- endif -%} {%endfor%}
报错信息
File "/home/jaja/Bureau/coding/bac_a_sable/sphinx_test/templates/template1.rst", line 5, in top-level template code {% for k, v in sample.items() recursive %} ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/jaja/Bureau/coding/bac_a_sable/sphinx_test/templates/template1.rst", line 21, in template {{ loop(v) }} ^^^^^^^^^^^^^^^^^^ File "/home/jaja/Bureau/coding/bac_a_sable/sphinx_test/templates/template1.rst", line 5, in template {% for k, v in sample.items() recursive %} ^^^^^^^^^^^^^^^^^^^^^^^^^ ValueError: not enough values to unpack (expected 2, got 1)
我原本以为第一次循环的v值{"b": "c"}能正常递归,但实际报错,想知道Jinja是否不支持递归遍历字典?
Jinja完全支持递归遍历字典,报错原因是递归调用的方式错误。
递归循环{% for k, v in ... recursive %}期望传入的是键值对组成的可迭代对象(比如dict.items()返回的内容),但你调用loop(v)时,v是字典本身,直接迭代字典只会得到它的键(单个字符串),进入递归循环后,for k, v in ...尝试将单个字符串拆成两个变量,自然会报not enough values to unpack的错误。
修正方法很简单,把loop(v)改成loop(v.items()),让递归传入的是字典的键值对集合:
.. toctree:: :maxdepth: 3 {% for k, v in sample.items() recursive %} - {{ k }}: {%- if v is string %} {{ v }} {%- else %} {{ loop(v.items()) }} {%- endif -%} {%endfor%}
这样修改后,递归时传入的是v.items(),每个元素都是(key, value)的元组,就能正常完成键值对的解包,实现多层字典的递归遍历了。
内容的提问来源于stack exchange,提问作者Jaja
相关产品推荐
相关产品推荐

