这是我用于生成模板的Python代码
import jinja2
with open('test.j2', 'r') as f:
template_body = f.read()
template = jinja2.Template(template_body)#, trim_blocks=True)
result = template.render(longest=len('staging'),
envs=['devel', 'staging', 'prod'])
print(result)
这里的想法是我想根据列表中的最长字符串生成缩进。
devel = 1
staging = 1
prod = 1
我终于想出了一个解决方案:
{% for env in envs -%}
{%- set padding = (longest - env|length + 1)|string %}
{% set f = "%-" + padding + "s" -%}
{{ env }}{{ f | format(' ',)}}= 1
{%- endfor %}
但是我得到了
$ python test.py
devel = 1
staging = 1
prod = 1
在输出的开头有一个额外的换行符。使用Python的调试器,我们可以看到输出:
$ python test.py
> /private/tmp/test.py(11)<module>()
-> print(result)
(Pdb) result
u'\ndevel = 1\nstaging = 1\nprod = 1'
答案 0 :(得分:1)
通过在set
行中不取消换行,可以在每行之前打印换行。另一方面,您要在endfor
行的末尾禁止换行。因此,您会在每行之前获得一个换行符,但不会在每行之后获得一个换行符。
通过像这样更改代码,您将得到相反的结果:
{% for env in envs -%}
{%- set padding = (longest - env|length + 1)|string -%}
{% set f = "%-" + padding + "s" -%}
{{ env }}{{ f | format(' ',)}}= 1
{% endfor %}
和result
将
u'devel = 1\nstaging = 1\nprod = 1\n'