新しめのpython限定ですが(Python3.3以降)、ディレクトリは何もしなくてもモジュールになります。
python
1$ mkdir hoge
2$ python
3>>> import hoge
4>>> hoge
5<module 'hoge' (namespace)>
だから、
from モジュールを格納しているディレクトリ名 import モジュール名
という表現よりは
from サブモジュールを格納しているモジュール名 import サブモジュール名
とした方が、from
の次は常にモジュールになって一貫性が保てます。
__init__.py
を置いたディレクトリは微妙に違う扱いになります。
python
1$ echo "" > hoge/__init__.py
2$ python
3>>> import hoge
4>>> hoge
5<module 'hoge' from '/.../hoge/__init__.py'>
__init__.py
から読み込まれたという扱いにされます。これはいろいろと便利な使いみちがあるので、モジュールより上位の存在としてパッケージと称します。でもこれもモジュールの亜種です。
あとpythonのソースコードもモジュールです。
python
1$ echo "print('hello')" > fuga.py
2$ python
3>>> import fuga
4hello # ロード時に実行されるのは正常
5>>> fuga
6<module 'fuga' from '/.../fuga.py'>
さて、ここまで特に説明なくモジュールという言葉を使ってきましたが、
- モジュールはファイルである
- モジュールはディレクトリである
- モジュールはパッケージである
ちょっと本当は何なのかよくわかりませんね。そこで見方を変えて、pythonに読み込まれた後のモジュールについて考えてみます。
python
1>>> import hoge
2>>> type(hoge)
3<class 'module'>
このように、module
型のインスタンスです。つまり「pythonオブジェクトの一種」ですね。関数やクラスや変数と何ら変わりありません。
実のところ、ファイルやディレクトリや__init__.py
を置いたディレクトリが、プログラムの実行時にはそれぞれよしなにmodule
型のインスタンスに変換される、と考えるのが妥当です。読み込んでしまえばオブジェクト。
これは「関数やクラスや変数を書いたコード」と「関数やクラスや変数のメモリ上の実体」の関係に対応しています。表現の仕方がコードではなくファイル・ディレクトリだというだけで、本質的には同じだと思うとわかりやすいんじゃないかなー、と思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。