You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:25:05