Как опустить пустую строку после цикла 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
вручную в шаблоне через
+
и
-
, но рабочего примера с ними я не нашел.