5.4 パッケージ
1行のコードから始まり、関数、スタンドアローンプログラム、そして同一ディレクトリ内の複数モジュールへとステップアップしてきました。 Pythonアプリケーションをさらに大規模なものにするためには、モジュールをディレクトリ(フォルダ)の階層構造に整理する必要があります。このように階層化されたモジュールの集まりをパッケージと呼びます。
パッケージの作成手順
Section titled “パッケージの作成手順”例として、天気予報を返すプログラムをパッケージ化してみましょう。
ここでは sources というディレクトリ(パッケージ)を作り、その中に翌日の天気用と週間天気用の2つのモジュールを作成します。
1. 必要なディレクトリとファイルの準備
Section titled “1. 必要なディレクトリとファイルの準備”まず、作業フォルダ(ここでは boxes とします)の中に、以下のような構成でファイルとディレクトリを作成します。
boxes/├── weather.py (メインプログラム)└── sources/ (パッケージとなるディレクトリ) ├── __init__.py ├── daily.py (モジュール1) └── weekly.py (モジュール2)2. モジュールの作成(daily.py と weekly.py)
Section titled “2. モジュールの作成(daily.py と weekly.py)”sources ディレクトリの中に、それぞれのモジュールのコードを記述します。どちらも forecast という同じ名前の関数を持ちますが、返す値が異なります。
def forecast(): 'ニセの天気予報' return 'like yesterday'def forecast(): """ニセの週間天気予報""" return ['snow', 'more snow', 'sleet', 'freezing rain', 'rain', 'fog', 'hail']3. メインプログラムの作成(weather.py)
Section titled “3. メインプログラムの作成(weather.py)”親ディレクトリ(boxes/)にあるメインプログラムから、パッケージ内のモジュールを呼び出します。
パッケージからモジュールをインポートするには、from パッケージ名 import モジュール名 という構文を使用します。
from sources import daily, weekly
print("Daily forecast:", daily.forecast())print("Weekly forecast:")
# enumerate()を使って、リストの要素に1から始まる番号を振ってループするfor number, outlook in enumerate(weekly.forecast(), 1): print(number, outlook)ターミナルで weather.py を実行すると、パッケージ内の各モジュールが正しくインポートされ、それぞれの関数が実行されることが確認できます。
$ python weather.pyDaily forecast: like yesterdayWeekly forecast:1 snow2 more snow3 sleet4 freezing rain5 rain6 fog7 hail