Pythonのmoduleとpackage
python6. モジュール — Python 3.9.1 ドキュメント
Pythonではファイル名がそのままimportするmodule名となり、グローバル変数__name__
にその名前が入る。
エントリーポイントではこれが__main__
となるので、if __name__ == "__main__":
のようにしてimportした場合は実行されないコードが書ける。
moduleをコンパイルしたpyc
ファイルは__py_cache__
にキャッシュされ、ソースの変更日時を見て再利用される。
$ cat foo.py
def bar():
print("hello")
def _bar():
print("world")
print("aaaa")
$ python
Python 3.9.0 (default, Nov 21 2020, 14:01:50)
[Clang 12.0.0 (clang-1200.0.32.27)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo as f
aaaa
>>> f.__name__
foo
>>> f.bar()
hello
>>> f._bar()
world
from module import *
でimportすると関数外のコードは実行されず、_
から始まる関数はimportされない。
>>> from foo import *
>>> bar()
hello
>>> _bar()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '_bar' is not defined
>>> from foo import _bar
>>> _bar()
world
packageはmoduleをまとめたもので、そのディレクトリ名の名前空間を作る。
$ tree hoge/
hoge/
└── fuga.py
$ cat hoge/fuga.py
def piyo():
print("ok")
$ python
>>> import hoge.fuga
>>> hoge.fuga.piyo()
ok
この状態でfrom package import *
してもそのsubmoduleであるfugaはimportされない。
>>> from hoge import *
>>> fuga.piyo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'hoge' has no attribute 'fuga'
packageに__init__.py
というファイルを作るとpackage、あるいはそのsubmoduleがimportされた際にまずimportされる。
ここにグローバル変数__all__
を定義するとimport *
の際にそのsubmoduleがimportされる。
$ cat hoge/__init__.py
__all__ = ["fuga"]
print("aaaaa")
>>> from hoge import *
aaaaa
>>> fuga.piyo()
ok