python を学び始めると、if __name__ == '__main__'
をおまじないのように書くことになるでしょう。
まるでC言語の#include <stdio.h>
の如く。1
そんなおまじないたちにもちゃんとした意味があるので、解説していきたいと思います。
__name__
(dunder name 2) とは?
モジュールの名前を格納して、インポートシステムの中からモジュールを一意に識別するための変数です。
__name__
はスクリプトが読み込まれると、自動的に宣言されてモジュール名を格納します。
__main__
(dunder main) とは?
スクリプトとして直接実行されたのモジュール名を意味し、自動的に変数__name__
に文字列'__main__'
が格納されます。
if __name__ == '__main__'
とは?
これまで述べてきたことをまとまると、このif文は直接実行されたスクリプトか、それともインポートされたモジュールかを判定するための条件文です。
Trueなら直接実行されたもの、Falseならインポートされたモジュールということです。
最後にコードを実行して確認しておきましょう。3
test1.py
def hoge():
# __name__に格納されている文字列を表示します
print("\t : __name__ is \'{}\'".format(__name__))
if __name__ == '__main__':
# 直接実行されたスクリプトであることを意味します
print("test1.py : True")
hoge()
else:
# インポートされたモジュールであることを意味します
print("test1.py : False")
hoge()
test2.py
# このケースではインポートされたとき、モジュールが実行されます
import test1
def foo():
# __name__に格納されている文字列を表示します
print("test2.py : __name__ is \'{}\'".format(__name__))
if __name__ == '__main__':
foo()
execution
$ python test1.py
test1.py : True
: __name__ is '__main__'
$ python test2.py
test1.py : False
: __name__ is 'test1'
test2.py : __name__ is '__main__'
実行結果より示されたtest1.pyが直接実行されたときと、モジュールとしてインポートされたときとの振舞の違いから、先に述べたことの裏付けができたと思います。