※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト:【Python入門】モジュールを扱う際に重要な「if name == ‘main’:」とは?
#【Python入門】モジュールを扱う際に重要な「if name == ‘main’:」とは?
Pythonの勉強をしていてサンプルのプログラムなどを見ていると、「if name == ‘main’:」という1文をよく目にすることがあります。mainというとC言語やJavaといった他のプログラミング言語ではプログラムを書く上で欠かせないものですが、Pythonの場合は普段コーディングをする際にはmainは使いません。
しかし、この一文はPythonでモジュールを扱う上で重要な役割を果たします。今回は、この「if name == ‘main’:」というものが何を意味するのかについて説明します。
##モジュールとは
Pythonのコードはスクリプトファイルとして保存し、他のプログラムから再利用することができます。そのファイルのことをモジュールといいます。Pythonで標準ライブラリを読み込む際に「import」を使いますが、自作したモジュールもimportを使って読み込むことで、そのモジュールで定義した関数やクラスを他のプログラムでも使うことができます。
##if name == ‘main’:の意味
###name__とは?
モジュールの意味がわかったところで、次は「name」という変数について説明します。例として、以下のようなプログラムtest.pyがあるとします。
test.py
def test():
print('Hello World!')
if __name__ == '__main__':
test()
このプログラムを実行した結果は以下の通りになります。
Hello World!
この例では「Hello World!」と表示するtestという関数を定義しただけです。どこにも「name」という変数は宣言していません。にもかかわらず、test()が実行されているということは、if文がTrueを返しているということになります。いったい、どういうことでしょうか?
最初にこの「name」という変数について見ていきましょう。実はこの__name__という変数はPythonプリンタでPythonスクリプトを読み込むと自動的に作成されます。さらに、この中には実行しているスクリプトのモジュール名が自動的に代入されるようになっています。
###if name == ‘main’: の意味
__name__という変数が自動で作られ、さらに実行しているスクリプトのモジュール名が自動的に代入されることが分かりました。しかし、__main__というモジュールを作った覚えもありません。この__main__はどこからきているのでしょうか?
実は、Pythonスクリプトを直接実行した時には、そのスクリプトファイルは「main」という名前のモジュールとして認識されます。そのため、スクリプトファイルを直接実行すると__name__変数の中に自動で__main__という値が代入されるのです。
つまり、「if name == ‘main’:」の意味は、「直接実行された場合のみ実行し、それ以外の場合は実行しない」という意味だったのです。さきほどの例では、test.pyを直接実行したので、if文がTrueを返し、test()が実行されたのです。
試しに、test.pyの中に実行したモジュール名を表示する処理を加えました。
def test():
print('Hello World!')
if __name__ == '__main__':
test()
print('モジュール名:{}'.format(__name__)) #実行したモジュール名を表示する
これを実行すると、以下のような結果になります。
Hello World!
モジュール名:main
スクリプトファイルを直接実行した際にはモジュール名が「main」になっているのが分かりますね。
では、「直接実行された場合以外」とはどういった時のことでしょうか?それは、このスクリプトファイルをモジュールとして他のプログラムから読み込んだときです。test.pyをモジュールとしてimportするtest2.pyを作成しました。
test2.py
import test #test.pyをインポート
実行結果
モジュール名:test
test.pyをインポートして実行すると、モジュール名が「test」になっているのが分かります。つまり、test.pyがtestモジュールとして実行されているので、__name__には「test」が代入されています。そのため、「if name == ‘main’:」はFalseを返すので、test()が実行されなかったのです。
「if name == ‘main’:」はモジュールを作成中のテストや、現在はモジュール化するつもりはないが、モジュール化したときに無駄な処理を行わないようにしたい場合などに使われます。個人でプログラムを作っているうちはあまりモジュール化や再利用といったことは考えないかもしれませんが、大規模なプログラムを作る場合には必須の考え方です。ぜひ、覚えておきましょう。