27
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-10

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: ...というような表現がありますが、あくまで分かりやすく確認するためのものなので、日頃の開発の中で書くことは推奨しません。

27
28
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
28

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?