Как опустить пустую строку после цикла for в Jinja?

Я хотел бы сгенерировать следующий вывод с помощью j2cli:

// before
function (arg1,
          arg2,
          arg3)
// after

Я попробовал следующий шаблон:

// before
function ({% for param in ['arg1', 'arg2', 'arg3'] -%}
          {{param}}{{"," if not loop.last else ")"}}
          {% endfor %}
// after

Но он всегда производит дополнительную пустую строку в конце:

// before
function (arg1,
          arg2,
          arg3)
          
// after

Когда я пробую этот шаблон:

// before
function ({% for param in ['arg1', 'arg2', 'arg3'] -%}
          {{param}}{{"," if not loop.last else ")"}}
          {% endfor -%}
// after

Комментарий будет с отступом.

// before
function (arg1,
          arg2,
          arg3)
          // after

Вот этот

// before
function ({% for param in ['arg1', 'arg2', 'arg3'] %}
          {{param}}{{"," if not loop.last else ")"}}
          {%- endfor %}
// after

удаляет пустую строку в конце, но производит одну в начале.

// before
function (
          arg1,
          arg2,
          arg3)
// after

И этот

// before
function ({% for param in ['arg1', 'arg2', 'arg3'] -%}
          {{param}}{{"," if not loop.last else ")"}}
          {%- endfor %}
// after

удаляет все пробелы.

// before
function (arg1,arg2,arg3)
// after

Как правильно отформатировать функцию?

2 ответа

Решение

Я понял: (иногда помогает поспать одну ночь)

// before
function ({% for param in ['arg1', 'arg2', 'arg3'] -%}
          {{param}}{% if not loop.last %},
          {% endif %}
          {%- endfor %})
// after

Дефолт Джиндзя forцикл здесь не помогает, потому что он форматирует каждую строку одинаково. Либо в начале каждого цикла, либо в конце он сохраняет комбинацию новой строки + отступа. Но перед первой строкой и после последней строки новая строка + отступ нежелательны. Строки нельзя форматировать единообразно.

Таким образом, решение состоит в том, чтобы отключить обработку пробелов по умолчанию для for петля {% for -%}...{%- endfor %} и генерировать новую строку + отступ после каждой, кроме последней, строки вручную.

Возможно, выровняв endif в том же столбце, что и {{param}}. В - из endfor просто предотвращает создание пробелов и съедает пробелы после endif но не съедает пробелы, создаваемые телом if.

У меня есть рабочий пример только с кастомной конфигурацией:

j2_custom.py:

def j2_environment_params():
    """ Extra parameters for the Jinja2 Environment """
    # Jinja2 Environment configuration
    # http://jinja.pocoo.org/docs/2.10/api/#jinja2.Environment
    return dict(
        # Remove whitespace around blocks
        trim_blocks=True,
        lstrip_blocks=True,
    )

j2-template.j2:

// before
function ({% for param in ['arg1', 'arg2', 'arg3'] %}
{{"          " if not loop.first else ""}}{{param}}{{"," if not loop.last else ")"}}
          {% endfor %}
// after

cli call:

$ j2 j2-template.j2 --customize j2_custom.py
// before
function (arg1,
          arg2,
          arg3)
// after

Есть контроль белого пространства, где вы можете контролировать lstrip_blocks и trim_blocks вручную в шаблоне через + и -, но рабочего примера с ними я не нашел.

Другие вопросы по тегам