2017-03-09 13 views
0

ほとんど無限の量の子供を持つジンジャーテンプレートの辞書をループしています。子供たちはセットと辞書を含んでいます。ここでの作業データセットのJinja2 recursion over python辞書とセット

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でこの再帰的問題をどのように解決できますか?

答えて

0

しばらく調査した後、私はそれを理解しました。

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)) 

ジンジャーテンプレートエンジンには、Pythonにはない多くの条件があります。

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 
をあなたは、このような上記のコードをフォーマットする必要がありますので、しかし、神社は空白の世話します