プログラムが大規模になりコードの長さが何千、何万行となってくると、その中から特定の処理を探すだけでも大変ですし、どのような関数が定義されているのか把握しづらいです。そこである程度コードが長くなるとモジュール(別のファイル)に分割します。
例として次のようなコードを用意しました。
def attack(ad = 100, skill = 2): damage = ad * skill print("勇者は" + str(damage) + "のダメージを与えた") attack()
このコードのattack関数を定義している部分をモジュールに分割してみましょう。
モジュールを作成するには次のように新たにPythonファイルを作成してコードを記述します。
ここでは『battle.py』というファイル名(モジュール名)としておきましょう。これでモジュールの作成は完了です。
ではこのモジュールを元のファイルで読み込んでみましょう。モジュールを読み込むには呼び出し元のファイルで次のように記述します。
import モジュール名 モジュール名.関数名()
標準ライブラリのモジュールを読み込むときと同じです。
実はこれまでに使用してきた標準ライブラリのモジュールもこのように別のファイルに関数などが記述されていて、それを呼び出して使用しています。
では実際に先ほどのbattleモジュールからattack関数を呼び出して使用してみましょう。
次のように記述します。
import battle # battleモジュールをインポート battle.attack() # モジュールからattack関数を呼び出し
実行結果は次のとおりです。
勇者は200のダメージを与えた
ちゃんと別のファイルに記述した処理が呼び出されて実行されているのがわかります。
モジュールを作成する際の注意点として、importで読み込んだ時点でファイルが実行されてしまうことも覚えておきましょう。
例えば先ほど作成したbattleモジュールの中身を次のように変更してみましょう。
def attack(ad = 100, skill = 2): damage = ad * skill print("勇者は" + str(damage) + "のダメージを与えた") print("ここにprint関数などがあると…")
これで再び元のファイルでモジュールを読み込み、attack関数を実行してみます。
import battle battle.attack()
実行結果は次のとおりです。
ここにprint関数などがあると… 勇者は400のダメージを与えた
importでモジュールを読み込んだ時点でprint関数が実行され、「ここにprint関数などがあると…」という一文が表示されてしまいました。
3行目の「勇者は~」という部分は関数定義の記述なので、実行されても関数が定義されるだけで表示されることはありませんが、「ここに~」の部分はprint関数を呼び出す記述のため、実行されれば表示されてしまいます。
このようなことにならないために、モジュールには不用意に関数などを実行する記述をしないようにしましょう。