Как рекурсивно вызвать макрос в jinja2?

Это мой шаблон jinja для генерации кода C# из моей модели данных.

using System;

namespace {{ domain["ns"] }} {
{% for class in domain["content"] %}
    public class {{ class["name"] }} {

    #region Inners
        {{ class["innerClass"] }}
    #endregion

    #region Props
    {% for field in class["content"] %}
        {% if field["readonly"] == "true" %}
            {% set readonly="private" %}
        {% else %}
            {% set readonly="" %}
        {% endif %}
        public {{ field["type"] }} {{ field["name"] }} {get;
                {{ readonly }} set{

                    if ({{ field["constraint"] }}){
                        {{ field["name"] }}=value;
                    }else {
                        throw new Exception("Inserted value for {{ field["name"] }} is not valid!");
                    }
                }
        }
    {% endfor %}
    #endregion
    }
{% endfor %}
}

это мой вопрос, для создания внутренних классов я хочу рекурсивно зациклить мою модель данных. Как я могу передать класс ["innerClass"] в качестве параметра для моего первого оператора for?


person Pooya    schedule 03.07.2012    source источник
comment
для рекурсивной визуализации древовидной структуры вы также можете использовать рекурсивную функцию циклов jinja2, пример   -  person jfs    schedule 03.07.2012
comment
@J.F.Sebastian: Это чище, чем мое решение. Вы должны сделать свой комментарий ответом.   -  person Helgi    schedule 04.07.2012
comment
Однако @Helgi Yours намного проще. Синтаксис рекурсивного цикла Jinja более запутан, чем обычная рекурсия.   -  person Elliot Cameron    schedule 05.06.2016


Ответы (1)


Вы можете использовать макросы, написать макрос для рендеринга класса, а затем вызвать его рекурсивно. :

{% macro render_class(class) -%}
class {{ class.name }}
{
{% for field in class.fields %}
    int {{ field }};
{% endfor %}
{% for subclass in class.subclasses %}
{{ render_class(subclass) }}
{% endfor %}
}
{%- endmacro %}

{% for class in classes %}
{{ render_class(class) }}
{% endfor %}

Это работает хорошо, но не имеет отношения к правильному отступу подклассов, что приводит к следующему коду:

class Bar
{
    int meow;
    int bark;

class SubBar
{
    int joe;
    int pete;
}
}
person Helgi    schedule 03.07.2012