はじめに
<バージョン>
Python: 3.7.4
jinja2: 2.7.2
jinja2テンプレートでfor/if文を書く際に、ハイフンの有無や位置で改行のされ方が変わります。
for文を書くときにいつも迷うのでまとめます。
以下の出力を得るにはどう書けばよいのでしょう?
start
apple0
orange0
apple1
orange1
end
パターン1:全てにハイフンを入れる
以下のテンプレートが今回の基準になります。
for文の開始位置、終了位置の前後それぞれにハイフンを入れます
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
パターン1:実行結果
appleとorangeの間だけ改行が入ります。
for文の中に書いてある内容は勝手に改行してくれるようです。
startapple0
orange0apple1
orange1end
パターン2:for文開始位置の手前のハイフンを消す
start
{% for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
パターン2:実行結果
startとapple0の間が改行されました。
for文開始位置の手前は、for文の開始時に1回だけ改行します。
start
apple0
orange0apple1
orange1end
パターン3:for文開始位置の後ろのハイフンを消す
start
{%- for i in range(2) %}
apple{{ i }}
orange{{ i }}
{%- endfor -%}
end
パターン3:実行結果
apple0とapple1の手前に改行が入りました。
for文開始位置の後ろは、for文内の開始位置で毎回改行します。
start
apple0
orange0
apple1
orange1end
パターン4:for文終了位置の手前のハイフンを消す
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{% endfor -%}
end
パターン4:実行結果
orange0とorange1の後ろに改行が入るようになりました。
for文終了位置の手前は、for文内の最終行で毎回改行します。
startapple0
orange0
apple1
orange1
end
パターン5:for文終了位置の後ろのハイフンを消す
start
{%- for i in range(2) -%}
apple{{ i }}
orange{{ i }}
{%- endfor %}
end
パターン5:実行結果
orange1の後ろに改行が入るようになりました。
for文終了位置の後ろは、for文を出るときに1回だけ改行するようです。
startapple0
orange0apple1
orange1
end
まとめ
今までの内容を踏まえると以下のようになります。
ハイフンを消す位置 | 改行の仕方 |
---|---|
for文開始位置の手前 | for文開始時に1回だけ改行 |
for文開始位置の後ろ | ループの先頭で毎回改行 |
for文終了位置の手前 | ループの末端で毎回改行 |
for文終了位置の後ろ | for文終了時に1回だけ改行 |
つまり、最初の出力を得るには、
・startとapple0の間で2回改行している
→for文開始位置の前後のハイフンは不要
・orange1とendの間で2回改行する必要がある
→for文終了位置の前後のハイフンは不要
ということで、「全てのハイフンを消す」が正解となり、以下のようになります。
start
{% for i in range(2) %}
apple{{ i }}
orange{{ i }}
{% endfor %}
end
start
apple0
orange0
apple1
orange1
end