🐍 Pythonパッケージ: __init__.py の理解と活用法

post-cover

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を使用して、パッケージを明示的に定義することが一般的らしい。


Profile picture
michael ☻︎ 🇯🇵
Web Engineer(PHP/Laravel, Python/FastAPI/Flask, TypeScript/Vue/React, AWS/GCP, etc.) / Freelance /
Profile picture
michael ☻︎ 🇯🇵
Web Engineer(PHP/Laravel, Python/FastAPI/Flask, TypeScript/Vue/React, AWS/GCP, etc.) / Freelance /
FebMarAprMayJunJul
© 2024, PWE