python - Jinja2 递归似乎总是产生深度超出错误

标签 python recursion jinja2

我以前从未使用过神社递归,但看起来应该是比较容易理解的。我在使用模板引擎以这种格式呈现数据时遇到问题。以下 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/

相关文章:

python - 在 popen 调用中扩展/替换变量

python - 在 Python 中对字符进行分组

python - 使用不同的数据框更改列值 - Python Pandas

c - 有多少递归函数调用导致堆栈溢出?

performance - 寻求最佳算法(渐近地)并忽略其他细节

Flask - 使用装饰器和路由参数来渲染带有自定义 jinja2 标签的数据

python - 在 Flask 路由中使用变量

Python HTTP 服务器可用于多个请求

javascript - Sinon 、递归和 setTimeout

python - 使用 include 动态指向 HTML