Python講座 / importでモジュールを読み込み、コードを分割する
モジュールは再利用するPythonコードの単位で、最初は一つの.pyファイルとして作れます。importはソース文字列を貼り付ける操作ではなく、モジュールを探して初期化するため、配置と最上位の実行文が重要になります。
計算とアプリケーションを別ファイルにする
同じ実習フォルダーに、再利用する計算をexpense_math.py、呼び出す側をapp.pyとして保存します。モジュール名にはハイフンではなくアンダースコアを使い、標準ライブラリーを隠すjson.pyやcsv.pyという名前を避けます。
import expense_mathではモジュール名が使え、expense_math.totalと呼びます。from expense_math import totalでは関数名を直接使えますが、ほかのtotalと衝突しないかに注意します。
二つのファイルを保存して実行する
expense_math.pyの全体です。
def total(amounts):
return sum(amounts)
app.pyの全体です。
import expense_math print(expense_math.total([3500, 8000, 2500]))
両方のファイルがあるフォルダーで実行します。
python app.py
結果は14000です。この例に外部パッケージは不要ですが、ヘルパーを探せるように、ファイル名は説明と同じものを使います。
検索と初期化の仕組みを確認する
モジュールの探索は、実行方法、プロジェクト構造、導入した環境に依存します。ModuleNotFoundErrorでは、sys.pathの変更やグローバルな場所へのコピーより先に、つづり、インタープリター、フォルダー配置を調べます。
モジュール最上位の文は最初のimport時に動きます。そこでinput()や削除処理を書けば、再利用したいだけでも処理が始まります。実際の作業は関数へ入れ、明示的な入口から呼びます。読み込んだモジュールは通常キャッシュされるため、修正した内容の確認にはプロセスを再起動します。
再利用と循環参照を確認する
app.pyの一つの金額を変え、同じヘルパーから異なる合計が出ることを確かめます。関数の外へ一時的にprintを置いてimport時の実行を観察したら、取り除いてください。json.pyという名前が標準のJSONモジュールを隠す理由も説明してみましょう。
二つのモジュールが互いをimportすると、初期化が終わる前に名前を必要として失敗する場合があります。共通部分を第三のモジュールへ移すなどして依存方向を単純にします。パッケージと実行入口では、読み込んだだけでアプリを動かさない構成を作ります。
二つのファイルは同じ練習フォルダーに置き、そこをターミナルの作業場所にします。importに失敗したら、使用中のPython、作業場所、標準ライブラリと衝突するファイル名を確認します。sys.pathを無条件に書き換える前に、配置と実行方法をそろえます。
practice/ main.py helper.py
main.pyがhelper.pyを読み込む配置例です。実際の練習では本文で指定したファイル名を使います。




