init.pyについてメモ
init.pyの役割
各ディレクトリ内のモジュールを読み込む際のマーカーとなる。
├── module.py
└── modules
├── __init__.py
├── module1.py
└── module2.py
module1.py
print( "in module1.py" )
def hello(caller=""):
print( "Hello, world! in module1 called by {}".format(caller) )
module2.py
print( "in module1.py" )
def hello(caller=""):
print( "Hello, world! in module1 called by {}".format(caller) )
module.py
from modules.__init__2 import *
hello1()
hello2()
実験1 init.pyなし
Traceback (most recent call last):
File "module.py", line 3, in <module>
hello1()
^^^^^^
NameError: name 'hello1' is not defined
定義なしでエラーになる。
実験2 init.pyだけ作成
Traceback (most recent call last):
File "module.py", line 3, in <module>
hello1()
^^^^^^
NameError: name 'hello1' is not defined
同じくエラー
実験3 init.py内でモジュールをインポートする
init.py
print( "in __init__.py" )
from .module1 import hello as hello1
from .module2 import hello as hello2
__all__ = ['hello1', 'hello2']
hello1("__init__.py")
hello2("__init__.py")
in __init__.py
in module1.py
in module2.py
Hello, world! in module1 called by __init__.py
Hello, world! in module2 called by __init__.py
Hello, world! in module1 called by
Hello, world! in module2 called by
実行された!
init.pyがない場合
ちなみに__init__.pyがない場合は、module.pyでモジュールを読み込んであげれば動く
module.py
from modules.module1 import hello as hello1
from modules.module2 import hello as hello2
hello1()
hello2()
この場合は使用するパッケージを全てimportする必要があり、処理が長くなる。 ただ、使用する関数やクラスなどがどこで宣言されているのか明確なので、この方法でも良い気がする。
init.pyを使用して、パッケージを明示的に定義することが一般的らしい。