Pythonには__name__という名前で定義されている特殊な変数があります。この変数はPythonのプログラムが「どこから呼ばれて実行されているか」を格納していて、直接実行されている場合には”__main__”という文字列が、そうでない場合はPythonファイルのモジュール名が格納されます。
前記事のbattle.pyには例として明らかに無駄なprint関数を記述しましたが、場合によっては次のように別のファイルで定義している関数を再利用したいことがあるかもしれません。
def attack(ad = 100, skill = 2): damage = ad * skill print("勇者は" + str(damage) + "のダメージを与えた") attack()
このbattle.pyモジュールにはattack関数を定義したあと、実行するよう記述されているため、インポートした時点でattack関数が実行されてしまいます。
実際にtest.pyから呼び出してみましょう。
import battle # この時点でattack関数が実行されてしまう print("勇者の攻撃") battle.attack() # 本来はここでだけ実行したい
実行結果は次のようになります。
勇者は200のダメージを与えた 勇者の攻撃 勇者は200のダメージを与えた
importでモジュールを読み込んだ時点で余計なattack関数が実行されてしまいました。
モジュールとしてのみ利用するファイルであれば関数実行部分のコードを消しておけばいいのですが、このbattle.py自体をメインプログラムとして直接実行させる必要もある場合は実行部分のコードを消すわけにはいきません。
そこで便利なのが__name__変数による条件分岐です。battle.pyの中身を次のように書き換えてみましょう。
def attack(ad = 100, skill = 2): damage = ad * skill print("勇者は" + str(damage) + "のダメージを与えた") if __name__ == "main": # もしこのファイルが直接実行されていたら attack()
__name__変数はプログラムが直接実行されている場合には”__main__”という文字列が、そうでない場合はPythonファイルのモジュール名(この場合は”battle”)が格納されます。
attack関数の実行部分をif文の中に記述したため、このプログラムファイルが直接実行された場合はattack関数が実行され、外部からimportされた場合は実行されません。
実際に先ほどと同じようにtest.pyから呼び出してみましょう。
import battle # 今度はここで勝手に実行されない print("勇者の攻撃") battle.attack() # ここでだけ実行される
実行結果は次のとおりです。
勇者の攻撃 勇者は200のダメージを与えた
ちゃんとtest.pyの中で明示的に呼び出した部分でのみattack関数が実行されています。