Eggがよくわからんと少し調べてたら、Python plugins egg cooking mini-howto ってのがわかりやすかったので、デコレーターっぽいことをしてみた。
まず環境汚すのがいやだったのでvirtualenvでテスト環境をつくる。pylonsだとスクリプトでよろしくやってくれるのだけど、自分で作る場合にはvirtualenvwrapperを使うとよいらしい。
というか使ってみると便利すぎ。これは手放せん。
続いて実際に書いてみる。ディレクトリ構造はこんな感じ
$ ls -R deco
minus/ mydeco.py plus/
deco/minus:
minus_plugin/ setup.py
deco/minus/minus_plugin:
minus.py
deco/plus:
plus_plugin/ setup.py
deco/plus/plus_plugin:
plus.py
ポイントはsetup.pyのentry_pointsってとこで、呼び出す方は entry_pointsに選んだ名前をpkg_resources.iter_entry_points("xxxx")に指定して呼べばいい。
アーカイブはここに置いといた
mydeco.py
#!/usr/bin/env python
# -*- encoding:utf-8 -*-
import pkg_resources
for entrypoint in pkg_resources.iter_entry_points("my.plugins"):
plugin_class = entrypoint.load()
decorater = plugin_class()
print decorater.display("hello world!")
実行結果
$ python mydeco.py
++++++++++++++++
+ hello world! +
++++++++++++++++
----------------
| hello world! |
----------------
エキスパートPythonプログラミングの4,6章あたりでも触れられており、これも参考になった。