パッケージについて

Pythonにはパッケージって概念あるよね。ただコード上で明示的にパッケージの宣言はしていないと思う。Perlなら「package」と明記するんだがPythonは処理系が自動的にパッケージを認識してくれるの?

# TestClass.py
class happyMonday():
  pass

class badTuesday():
  pass

def dayToHappy():
  pass

def __test():
  pass

if __name__ == '__main__':
  __test()

ちょっと上記のようなクラスを作ってみた。

>>> import TestClass
>>> TestClass
<module 'TestClass' from 'TestClass.py'>
>>> from TestClass import happyMonday
>>> happyMonday
<class TestClass.happyMonday at 0x00AEDDB0>
>>> from TestClass import dayToHappy
<function dayToHappy at 0x00AF6B70>
>>> from TestClass import __test
>>> __test
<function __test at 0x00AF6C30>
>>> __test()

面白いね。ファイルごとにパッケージ管理を行っているイメージなのかな?クラスはわかるが、ファンクションを「import」できるのには新しい発見だ。あと「__test」がcallできちゃうんだね。なんで?そんなもの?まあいいや。

凄く面白いなと思ったのは、ディレクトリの中に「__init__.py」を作ると、ディレクトリをインポートできるんですね。面白いです。そのパッケージをインポートする際に必要なモジュール、変数を設定したりするのかな?まだ、使いどころがわからないが、少し驚いた。

「./test」を作って、その直下に空ファイル「__init__.py」を作成。

>>> import test
>>> test
<function test at 0x00AF6BB0>
>>> t = test()
>>> t
<module 'test' from 'test\__init__.py'>
>>>

「import test」をやる事によって、そのディレクトリ配下の「__init__.py」を見に行くんだね。この事により階層構造を容易に作成できインポートも簡単に行えるわけだって本当か!ディレクトリ配下に「__init__.py」が存在しなければ、ただのディレクトリに過ぎないので「import」は行えない。

>>> import ss
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named ss

ちなみに、「import test」とやると、標準モジュールに「test」が存在し、そっちを見に行くので注意かな。では