我以前从未使用过神社递归,但看起来应该是比较容易理解的。我在使用模板引擎以这种格式呈现数据时遇到问题。以下 python 代码是我试图在 Jinja 中重现的一个很好的例子:
layers = {
'groups': {
'lower': {
'groups': {},
'layers': [{
'layer_name': 'left #1',
},
{
'layer_name': 'right #1',
}]
},
'upper': {
'groups': {},
'layers': [{
'layer_name': 'left',
},
{
'layer_name': 'right',
}]
}
},
'layers': [{
'layer_name': 'Background',
}]
}
def printDict(_dict):
for layer in _dict['layers']:
print(layer['layer_name'])
for group in _dict['groups']:
print(group)
printDict(_dict['groups'][group])
printDict(layers)
我尽量让模板代码和上面的工作逻辑类似,像这样:
<ul>
{% for node in layers recursive %}
{% set outer_loop = loop %}
{% if node == "layers" %}
{% for layer in layers[node] %}
<li>{{layer['layer_name']}}</li>
{% endfor %}
{% elif node == "groups" %}
{% for group in layers[node] %}
<li><b>{{group}}</b></li>
<ul class="submenu">
{{ outer_loop(layers[node][group]) }}
</ul>
{% endfor %}
{% endif %}
{% endfor %}
</ul>
但是,每次我都收到“超出递归深度”的提示。这对调试来说非常令人沮丧,因为没有任何简单的调试器或方法可以在循环期间打印值。任何人都可以发现逻辑缺陷吗?
最佳答案
好的,我最终找到了一种工作方法。问题是 Jinja 有非常奇怪的变量作用域。与 python 不同,在循环内部变量不会重新分配,它会继续使用原始全局变量,这会导致无限循环条件。我通过在每个递归调用(和原始调用,以保持一致)上使用“.items()”方法解决了这个问题,该方法在本地范围内创建了一个新变量(我相信,也许它也只是覆盖了全局范围内的一个变量,但无论哪种方式都有效)
<ul>
{% for key, v in layers,items() recursive %}
{% set outer_loop = loop %}
{% if key == "layers" %}
{% for layer in v %}
<li>{{layer['layer_name']}}</li>
{% endfor %}
{% elif key == "groups" %}
{% for group in v %}
<li><b>{{group}}</b></li>
<ul class="submenu">
{{ outer_loop(v[group].items()) }}
</ul>
{% endfor %}
{% endif %}
{% endfor %}
</ul>
关于python - Jinja2 递归似乎总是产生深度超出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56087225/