如何在 Jinja 中的 for 循环后省略空行?

How to omit an empty line after a for loop in 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

如何正确格式化函数?

我只有 custom config:

的工作示例

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 调用:

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

white-space control 可以通过 +- 在模板中手动控制 lstrip_blockstrim_blocks,但我没有找到工作示例和他们在一起。

我明白了:(有时它有助于睡一晚)

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

Jinja 的默认 for 循环在这里没有帮助,因为它以相同的方式格式化每一行。在每个循环的开始或结束时,它都保持换行符+缩进的组合。但是在第一行之前和最后一行之后换行+缩进是不需要的。行不能统一格式化

所以解决方案是禁用 for 循环的默认空白处理 {% for -%}...{%- endfor %} 并在除最后一行之外的每一行之后手动生成换行符+缩进。

这可能是将 endif{{param}} 对齐在同一列中。 endfor- 只是阻止了空格的产生并吃掉了 endif 之后的空格,但没有吃掉 if 的正文生成的空格。