Python
python3
python3.6

[Python] if __name__ == '__main__' について理解しよう

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が直接実行されたときと、モジュールとしてインポートされたときとの振舞の違いから、先に述べたことの裏付けができたと思います。

参考


  1. 簡単に説明すると、これはプログラムに必要な関数が定義されているヘッダーファイルを読み込むためのものです。 

  2. dunder とは、double under(underscores)を意味します。 

  3. コードの中でif __name__ == '__main__': .... else: ...というような表現がありますが、あくまで分かりやすく確認するためのものなので、日頃の開発の中で書くことは推奨しません。