如何在 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_blocks
和 trim_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
的正文生成的空格。
我想用 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_blocks
和 trim_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
的正文生成的空格。