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

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

windows7でpythonをひとまず使う

今更ですが、windows7でpythonを使う用事ができたので、
環境構築メモ。

◎パッケージのGET
pythonをダウンロード
まあ、本家からDLするのが無難ですね。
https://www.python.org/downloads/

職場環境がまだpython2系なので、ここはひとまずPython2系を落としてくる。
32ビット・64ビットがあるので、環境に合わせてDL
ひとまず作るならmsiファイルが便利でしょうね。

◎インストール
DL→MSIファイルなので、
ダブルクリックか、右クリック→インストールでOK

デフォルトだと、c:\Python27と、トップレベルがインストールディレクトリに。
私は、トップレベルだとちょっと気持ち悪いので、
c:\Tools\python27
ってしていますが、お好みで。。。

○パス
次に、パスを通します。
これは後でも良いですが、
コマンドラインから、
$path %PATH%;c:\Python27;  ←インストールした場所
のように通します。

○パッケージ管理ツールのインストール
・setuptools:easy_installの用意
素のままのpythonだと、いろいろ足りないので、
豊富に用意されているパッケージの利用をしていく事になります。
このために、pipというスクリプト?を用意すると便利です。

このpipをインストールするために、
setuptools
のインストールをします。

これは、
https://pypi.python.org/pypi/setuptools
にあります。

これ読んで行と、windowsは、シンプルに
ez_setup.py
を使えばOKな事がわかります。
で、そのez_setup.pyは、
https://bootstrap.pypa.io/ez_setup.py
から直落としができます。
(直リンもどうかと思うので、一応リンクは切っておきますが、
 ページの中段の、
「Windows (simplified)」
の所にリンクがあるので、そこから落とせば良いと思います。

で、コマンドラインに戻り、

$python ez_setup.py

これで、python27のフォルダの下に、scriptsというフォルダができ、
この中に、easy_install.exeというのができあがります。

・pipの準備
これで、pipのインストールの準備が整いました。
その前に、easy_installが作られた、Scriptsもパスが通ってると便利なので、

$path %PATH%;c:\Python27\Scripts;

でパスを通しておきましょう。

で、

$easy_install pip

で、ようやくpipが使える様になります。

あとは、必要に応じてpipでパッケージをインストールしまくってください。