コンテンツにスキップ

モジュールとパッケージ

モジュール

Python においてモジュールとは Python のコードが記述されたファイルである。

6. モジュール — Python 3.12.6 ドキュメント

こういった要求をサポートするために、Python では定義をファイルに書いておき、スクリプトの中やインタプリタの対話インスタンス上で使う方法があります。このファイルを モジュール (module) と呼びます。

モジュールの例

以下はmodule.pyというモジュールをmain.pyから呼び出す例である。

構成

1
2
3
.
├── module.py
└── main.py

ファイル

1
2
def func() -> str:
    return "Hi"
1
2
3
import module

print(module.func())

実行結果

1
2
$ python main.py
Hi

パッケージとは

Python においてパッケージとは、複数のモジュールを持ち、かつ__init__.pyを含むディレクトリである。

6. モジュール — Python 3.12.6 ドキュメント

パッケージ (package) は、Python のモジュール名前空間を "ドット付きモジュール名" を使って構造化する手段です。

パッケージの例

以下はClassAクラスとClassBクラスを持つpackageというパッケージを__main__.pyから呼び出す例である。

例ではアプリケーション自体もappとしてパッケージ化している。パッケージはpython -m ${package_name}で実行できる。

構成

1
2
3
4
5
6
7
8
.
└── app
    ├── __init__.py
    ├── __main__.py
    └── package
        ├── __init__.py
        ├── class_a.py
        └── class_b.py

ファイル

1
2
3
4
5
6
from typing import Self


class ClassA:
    def say_hi(self: Self):
        print("Hi")
1
2
3
4
5
6
from typing import Self


class ClassB:
    def say_hello(self: Self):
        print("Hello")
1
2
from .class_a import ClassA
from .class_b import ClassB
1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from .package import ClassA, ClassB


def main() -> None:
    ClassA().say_hi()
    ClassB().say_hello()


if __name__ == "__main__":
    main()

実行結果

1
2
3
$ python -m app
Hi
Hello

相対 import と絶対 import

from .class_a import ClassAのような import を相対 import と呼ぶ。パッケージ内では相対 import を使うことが多い気がする。