E71:Pythonのパッケージを使ってみる
Last-modified: 2013-08-24 (土) 02:14:21 (3897d)
Top / E71:Pythonのパッケージを使ってみる
E71:Pythonのパッケージを使ってみる †
個人的開発中のソースが大きくなってきたので、Pythonのパッケージを使ってみます。
さすがに、たいした規模じゃなくても、E71で100行を超えるソースを編集するのが辛くなってきたので、パッケージを使ってソース分割したいわけです。
Pythonのパッケージ †
Pythonでは、モジュールを格納するディレクトリに「__init__.py」というファイルを置くことで、そのディレクトリをパッケージとして扱えるようになります。
「__init__.py」は、そのパッケージ内のモジュールがインポートされる際に実行されるスクリプトになります。
「__init__.py」の中身は、何もなければ空でいいみたいです。書く場合にはパッケージの初期化コードや、from package import *のときにインポートされるパッケージを指定する「__all__」を設定するみたいです。
詳しくはリファレンスマニュアルのチュートリアル6.4を参照されたし。
実際に使ってみる †
今回の例では、以下のようなパッケージ構成を作ります。
┣packageuse1.py パッケージを利用するためのスクリプト ┗testpackage : パッケージディレクトリ ┣__init__.py : パッケージの初期化スクリプト ┣test1.py : パッケージに含むモジュール ┗test2.py : パッケージに含むモジュール
「testpackage」というパッケージの中に、「test1」、「test2」というモジュールが入っている構成です。
test0.py、__init__.py、test1.py、test2.pyは以下のとおり
■packageuse1.py
from testpackage import * print dir() if __name__ == '__main__': test1.TestClass1().printtest()
■__init__.py
print '__init__.py was executed' __all__ = ['test1']
■test1.py
class TestClass1: def __init__(self): print 'TestClass1 Created!' def printtest(self): print 'TestClass1 method was executed'
■test2.py class TestClass2:
def __init__(self): print 'TestClass2 Created!'
def printtest(self): print 'TestClass2 method was executed'
まあ、内容は造作もないですな~
この構成で、test0.pyを実行すると、以下のような結果が得られます。
__init__.py was executed ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__warningregistry__', 'pyscripter', 'test1'] TestClass1 Created! TestClass1 method was executed
実行結果より、
- パッケージの中のモジュールを使う前に、__init__.pyの中が実行されていること
- 「__init__.py」の「__ALL__」を設定したことで、「import *」と指定したが、実際にインポートされたのは「test1」のみインポートされたこと
ってことがわかったりします。
自分が知りたかったことは以上!