2015年7月18日土曜日

Pythonのテンプレートエンジンmakoを使ってみる・その1

pythonにはテンプレートエンジンが沢山あって、
何を使うのか迷うのですが、
今回は、makoを試して見ました。

makoは、

$ cd ~
pip install mako
で準備可能です。

さて。

ひとまず試す

hellomako.py
from mako.template import Template

print(Template("hello ${data}!").render(data="world"))

まずはこれから。

python hellomako.py

出力結果
hello world!

"hello ${data}!" の ${data}部分が、
render(data="world"))の情報で置き換わってます。

これが最も単純な利用例でしょう。

ただ、まあ、このようにはあまり使いませんね・・・
ということで、ファイル参照をする方法に。。

先ほどの、”hello ${data}!”だけ抜き出して、hellomako.txtで保存します

hellomako.txt
hello ${data}!

で、
from mako.template import Template

mytemplate = Template(filename = "hellomako.txt")
print mytemplate.render(data="World")

と、ファイルを指定してあげれば外部ファイルからテンプレートを読み込ませる事が可能です。

出力結果
hello World!

さて、文字の置き換えは出来る様になりましたが、
これだけだとイマイチな部分もあります。


次に、リストの情報を、書きだしてみます。

テンプレートファイルを、
hellomako2.txt
%for elem in data:
hello ${elem}!
%endfor
こんな形にします。
これを、
hellomako2.py
from mako.template import Template

value = ["Tokyo","Osaka","Nagoya","Japan"]

mytemplate = Template(filename = "hellomako2.txt")
print mytemplate.render(data="World")
で読み出してみます。
出力結果
hello Tokyo!
hello Osaka!
hello Nagoya!
hello Japan!

とループして出力されましたね♪

ちなみに、loop.indexという予約後を使うと、ループ回数が得られるので、

%for elem in data:
${loop.index+1}: hello ${elem}!
%endfor
とすると、

出力結果
1: hello Tokyo!
2: hello Osaka!
3: hello Nagoya!
4: hello Japan!

ってな感じになります。

往々にしてデータはハッシュ(dict)の事もありますよね。
この場合は、
hellomako3.py
valuehash = {"english":"apple", "japanese":u"りんご"}
mytemplate2 = Template(filename = "makotest3.txt",  input_encoding='utf-8')
print(mytemplate2.render(data=valuehash))

テンプレート側は、
makotest3.txt
英語: ${data["english"]}
日本語 : ${data["japanese"]}
てな感じになります。

出力結果
英語: apple
日本語 : りんご
になります。

当然、ハッシュはリストの要素としても使えますので、
hellomako4.py
mytemplate2 = Template(filename = "makotest4.txt",  input_encoding='utf-8')

valuehash = [{"english":"apple", "japanese":u"りんご"},{"english":"orange", "japanese":u"みかん"},{"english":"banana", "japanese":u"ばなな"}]

print(mytemplate2.render(data=valuehash))

で、テンプレート側はforを使って、
makotest4.txt
%for elem in data:
英語: ${elem["english"]}
日本語 : ${elem["japanese"]}
%endfor

出力結果
英語: apple
日本語 : りんご
英語: orange
日本語 : みかん
英語: banana
日本語 : ばなな
ってなります。

また、ハッシュ(dict)の別の使い方として、key,valueとして渡す方法もあります。
沢山の引数を渡したいときも当然あると思います。
mytemplate2.render(data=valuehash,hoge=aaaaaa,hige=bbbbb)
なんて、書けば良いのですが、これは面倒です。
そういう時は、ハッシュ(dict形式)で渡すと便利です。

まず、テンプレートから。
makotest5.txt
英語: ${english}
日本語 : ${japanese}
hellomako4.py
from mako.template import Template

mytemplate2 = Template(filename = "makotest5.txt",  input_encoding='utf-8')
valuehash = {"english":"apple", "japanese":u"りんご"}
print(mytemplate2.render(**valuehash))

てな具合でソースを書きます。
mytemplate2.render(**valuehash)
と、**valuehashと、**変数名で、key=value渡しになります。


出力結果
英語: apple
日本語 : りんご

となります。

dict形式でデータがあるときに、keyの情報を取得したい場合も出てくると思います。
その時の対応方法です。

hellomako6.py
from mako.template import Template
mytemplate = Template(filename = "makotest5.txt",  input_encoding='utf-8')

valuehash = {"1111":{"english":"apple", "japanese":u"りんご"},"2222":{"english":"orange", "japanese":u"みかん"},"3333":{"english":"banana", "japanese":u"ばなな"}}

print(mytemplate.render(data=valuehash))



makotest5.txt
%for key,elem in data.items():
id=${key}
日本語:${elem["japanese"]}
英語:${elem["english"]}

%endfor
出力結果
id=1111
日本語:りんご
英語:apple

id=3333
日本語:ばなな
英語:banana

id=2222
日本語:みかん
英語:orange

まだまだ奥深いのですが、ひとまず使ってみられたかなーと思います

0 件のコメント:

コメントを投稿