Python 3.x python字典和集合上的Jinja2递归

Python 3.x python字典和集合上的Jinja2递归,python-3.x,dictionary,recursion,jinja2,nested-loops,Python 3.x,Dictionary,Recursion,Jinja2,Nested Loops,我在一个jinja模板中循环浏览一本字典,它几乎有无数的孩子。这些子项包含集合和字典。我试图循环使用以下数据集,并通过jinja打印它,如下例所示: EYE COURSES CLASS_0E CLASS_0F EYE|MIT COURSES CLASS_1E CLASS_2F EYE|MIT|NIT COURSES CLASS_1X CLASS_1D EYE|MIT|NIT|XXX COURSES CLASS_4X EYE|EDX COURSES CLASS_9A CLASS_9B 以下是使用

我在一个jinja模板中循环浏览一本字典,它几乎有无数的孩子。这些子项包含集合和字典。我试图循环使用以下数据集,并通过jinja打印它,如下例所示:

EYE
COURSES
CLASS_0E
CLASS_0F
EYE|MIT
COURSES
CLASS_1E
CLASS_2F
EYE|MIT|NIT
COURSES
CLASS_1X
CLASS_1D
EYE|MIT|NIT|XXX
COURSES
CLASS_4X
EYE|EDX
COURSES
CLASS_9A
CLASS_9B
以下是使用的数据集:

SCHOOL = {
  'EYE': {
    'COURSES': {
      'CLASS_0E',
      'CLASS_0F'
    },
    'EYE|MIT': {
      'COURSES': {
        'CLASS_1E',
        'CLASS_2F'
      },
      'EYE|MIT|NIT': {
        'COURSES': {
          'CLASS_1X',
          'CLASS_1D'
        },
        'EYE|MIT|NIT|XXX': {
          'COURSES': {
            'CLASS_4X'
          }
        }
      },
      'EYE|EDX': {
        'COURSES': {
          'CLASS_9A',
          'CLASS_9B'
        }
      }
    }
  }
}
这是我到目前为止所做的尝试,试图在它上面循环,但没有运气

from jinja2 import Template

template = Template(
"""
  {% for key, value in tree.items() recursive %}
    {{key}}
  {% if key == "COURSES" %}
    COURSES
    {{loop(value.items())}}
  {% else  %}
     * GOTO INTO THE NEXT CHILD AND REPEAT THE PROCESS *
  {% endif %}
  {% endfor%}
""")

print(template.render(tree = SCHOOL))

在Jinja2中如何解决这个递归问题?

经过一段时间的研究,我找到了答案

from jinja2 import Template

template = Template("""
{%- macro recurse(n) %}
    {%- for key, value in n.items() %}
        {%- if key is not equalto 'COURSES' %}
            {{key}}
        {%- endif %}
        {%- if 'COURSES' in value and value is iterable %}
            COURSES
            {%- for item in value['COURSES'] %}
                {{item}}
            {%- endfor %}
        {%- endif %}
        {%- if value.items is defined %}
            {{recurse(value)}}
        {%- endif %}
    {%- endfor %}
{%- endmacro %}
{{ recurse(tree) }}
""")

print(template.render(tree=SCHOOL))
Jinja模板引擎有很多python中没有的条件。但是Jinja关心空格,因此您需要将上述代码格式化为以下格式:

from jinja2 import Template

template = Template("""
{% macro recurse(n) %}{% for key, value in n.items() %}{% if key is not equalto 'COURSES' %}{{key}}{% endif %}{% if 'COURSES' in value and value is iterable %}
COURSES{% for item in value['COURSES'] %}
{{item}}{% endfor %}{% endif %}{% if value.items is defined %}   
{{recurse(value)}}{% endif%}{% endfor %}{% endmacro %}{{ recurse(tree) }}
""")

print(template.render(tree=SCHOOL))
这将为我提供所需的以下输出:

EYE
COURSES
CLASS_0E
CLASS_0F   
EYE|MIT
COURSES
CLASS_1E
CLASS_2F   
EYE|MIT|NIT
COURSES
CLASS_1X
CLASS_1D   
EYE|MIT|NIT|XXX
COURSES
CLASS_4X   
EYE|EDX
COURSES
CLASS_9B
CLASS_9A