【6日でできるPython入門】パッケージ

Pythonプログラムを大規模に開発する際、モジュールだけでは管理が難しくなることがあります
そこで登場するのが「パッケージ」です。
 パッケージはモジュールを格納したディレクトリであり、モジュールをまとめて階層的に管理するための「入れ物」になります。
複数のモジュールを含むプロジェクトをきれいに整理でき、他の開発者と共同作業しやすくなります。
ここでは、パッケージの構成方法や使い方、__init__.pyの役割などを実例とともに詳しく解説します。

1.パッケージの基本構成

1.1 ディレクトリ構成例

project/
  main.py
  package1/
    __init__.py
    module1.py
    module2.py
  • package1フォルダがパッケージです。
  • __init__.pyは空ファイルでも必須で、Pythonに「ここはパッケージです」と認識させます。

1.2. モジュール例 (module1.py)

ファイル名: module1.py

# package1/module1.py

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

1.3. main.pyからパッケージの利用

ファイル名: main.py

import package1.module1

result = package1.module1.add(10, 3)
print(f"10 + 3 = {result}")

実行結果

10 + 3 = 13
  • import package1.module1module1モジュールを読み込みます。
  • フルネーム package1.module1.add()で関数にアクセス。

2.パッケージからの便利なimport

2.1. from-import文での利用

ファイル名: main.py(修正版)

from package1 import module1

print(module1.subtract(10, 4))

実行結果

6

2.2. モジュール内の関数だけ直接import

ファイル名: main.py(修正版)

from package1.module1 import add

print(add(7, 2))

実行結果

9

2.3. importの別名

ファイル名: main.py(修正版)

import package1.module1 as mod

print(mod.add(1, 1))

実行結果

2

3. __init__.pyの活用

3.1. __init__.pyでモジュール関数をまとめてimport

ファイル名:__init__.py

# package1/__init__.py

from .module1 import add, subtract

3.2. main.pyの変更

ファイル名: main.py(修正版)

import package1

print(package1.add(5, 5))
print(package1.subtract(9, 4))

実行結果

10
5

解説

  • __init__.pyfrom .module1 import add, subtractを書くと、
    パッケージ名から直接これらの関数を呼べるようになります。
  • モジュール名を隠蔽し、呼び出し側のコードをシンプルに保てます。

3.3. __init__.py内に独自関数も定義可能

ファイル名:__init__.py(修正版)

# package1/__init__.py

def info():
    print("これはpackage1のパッケージです。")

from .module1 import add

ファイル名: main.py(修正版)

import package1

package1.info()
print(package1.add(3, 7))

実行結果

これはpackage1のパッケージです。
10

まとめ表:パッケージの基本

項目内容ポイント
パッケージモジュールをまとめたフォルダ__init__.pyが必須(Python 3.3以降は不要だが推奨)
モジュールPythonファイル(.py)関数・クラスのまとまり
import文パッケージやモジュールを読み込むimport package.module
from-import文必要な部分だけを読み込むfrom package.module import func
__init__.pyパッケージ初期化用ファイルパッケージ名でアクセス可能にする役割もある。
相対importfrom .module import func のようにパッケージ内を参照大規模プロジェクトでコード整理がしやすくなる。

パッケージを使いこなせば、大規模なPythonプロジェクトを分かりやすく整理し、メンテナンスや拡張もしやすくなります
__init__.pyの工夫でAPIの変更を柔軟にできるのも大きなメリットです。ぜひ実践で活用してみてください。