Рекурсия макроса в Jinja2

Я использую движок Jinja 2.8 templating. Я пытаюсь написать шаблон, который будет перемещаться по древовидной структуре и выводить информацию из этого дерева. Для этого я пытаюсь использовать макрос, который вызывает себя, который, похоже, не работает.

Этот простой рекурсивный макрос также не работает:

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

При запуске следующей ошибки повышается на третьей строке кода Jinja.

**************: 'factorial' is undefined

Поддерживает ли Jinja рекурсивные макросы? Как еще можно проложить вложенную структуру данных в Jinja?

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


Я столкнулся с этой проблемой и заметил, что мое определение макроса сидит в блоке if, а это значит, что он не будет там, если значение if будет равно false.

Но это не сработало, когда я переместил определение чуть выше блоков if - мне пришлось переместить его выше моего {% block content %}, прежде чем я смог заставить его работать.

Я бы предположил, что ваш код может сидеть в гнезде среди другого кода, который будет препятствовать его обнаружению.

licensed under cc by-sa 3.0 with attribution.