Pythonのmoduleとpackage

python

6. モジュール — 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