この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは。サービスグループの武田です。
JinjaというPythonのデファクトともい言えるテンプレートエンジンがあります。
さてこのJinjaですが、テンプレートエンジンというくらいですので、変数の埋め込みや制御構文が使用できます。
変数の埋め込み。
Hello, {{ name }}
if文の使用。
{% if cond %}
Hi
{% endif %}
Jinjaを使用する上でこの仕様はまったく困らないのですが、何らかの理由でプレースホルダーに使用する記号を変えたくなることもきっとあるでしょう。というわけでやってみました。
環境
$ pipenv --version
pipenv, version 2020.6.2
$ python3 -V
Python 3.8.3
またJinjaのバージョンは2.11.2
です。
やってみた
まずは適当なディレクトリを作成して環境を用意します。
$ mkdir /path/to/jinja2-test && cd $_
$ pipenv install
$ pipenv install jinja2
簡単なスクリプトを用意します。
main.py
from jinja2 import Environment
env = Environment()
text = "Hello, {{ name }}"
tpl = env.from_string(text)
msg = tpl.render({"name": "Classmethod"})
print(msg)
実行してみます。
$ pipenv run python main.py
Hello, Classmethod
問題なさそうですね。それではプレースホルダーをデフォルトの{{ foo }}
形式から${ foo }
形式に変えてみましょう。
main.py
from jinja2 import Environment
env = Environment(variable_start_string="${", variable_end_string="}")
text = "Hello, ${ name }"
tpl = env.from_string(text)
msg = tpl.render({"name": "Classmethod"})
print(msg)
ポイントはEnvironment()
の引数に指定しているvariable_start_string
とvariable_end_string
です。これらを指定することで変数プレースホルダーの記号を任意のものに変更できます。なお、ブロックやコメントの記号も変更可能です。
実行してみます。
$ pipenv run python main.py
Hello, Classmethod
うまく動きました!
まとめ
簡単ですがプレースホルダーの変更を試してみました。既存のシステムからの移行で、どうしてもテンプレート内の記号が変えられない場合などに思い出してあげてください。