Jinja2中的宏递归

时间:2015-09-24 22:25:25

标签: python recursion jinja2

我正在使用Jinja 2.8模板引擎。我正在尝试编写一个模板,它将遍历树结构并从该树输出信息。要做到这一点,我正在尝试使用一个调用自身的宏,这似乎不起作用。

这个简单的递归宏也不起作用:

{% macro factorial(n) %}
  {% if n > 1 %}
    {{ n }} * {{ factorial(n-1) }}
  {% endif %}
{% endmacro %}

{{ factorial(3) }}

在Jinja代码的第三行上出现以下错误时运行。

UndefinedError: 'factorial' is undefined

Jinja是否支持递归宏?如何在Jinja中遍历嵌套数据结构?

2 个答案:

答案 0 :(得分:2)

Jinja支持递归宏 关于阶乘代码,以下代码适用于我:

{% macro factorial(n,return_value) -%}
--{{n}}
  {%- if n > 1 -%}
    {%- set return_value = n * return_value %}      {#- perform operations on the variable return_value and send it to next stage -#}
    {{- factorial(n-1,return_value) -}}

  {%- else -%}      {# Output the return value at base case #}
    {{ return_value }}
  {%- endif %}

{%- endmacro %}

{{ factorial(7,1) }} 

我得到的输出是

--7--6--5--4--3--2--1  
    5040  

答案 1 :(得分:1)

我遇到过这个问题,并注意到我的宏定义位于if块中,这意味着如果if评估为false,它就不会存在。

但是当我将定义移到{% block content %}块之上时,它不起作用 - 我必须将它移到{{1}}之上才能让它工作。

我建议您的代码可能嵌套在其他代码中,这些代码会阻止它被发现。