TL;DR
以下の摩訶不思議な if 文は一体何を意味しているのだろうか?まずは、アンダースコアがついた特殊変数について説明する。
if __name__ == "__main__":
のポイント
- スクリプトとして直接実行したときのみ処理を行うことができる
- インポート元のファイルの末尾に加えることでスクリプトとしても使える
- 実行したいコードと実行したくないコードを分けることができる
特殊変数の意味
if __name__ == "__main__":
Python には特殊変数と呼ばれるものがあり、__名前__
の形をしている。有名なところでは、__init__
や__new__
がある。
公式ドキュメントでは以下のように言及されている。
予約済みの識別子種 システムで定義された (system-defined) 名前です。これらの名前はインタプリタと (標準ライブラリを含む) 実装上で定義されています; 現行のシステムでの名前は 特殊メソッド名 などで話題に挙げられています。 Python の将来のバージョンではより多くの名前が定義されることになります。
2. 字句解析 — Python 3.5.10 ドキュメント
次に、if 文の左辺と右辺に記述されている特殊変数の意味について説明しよう。
if 文の左辺に記述されている、特殊変数__name__
は、Python ごとに、そのファイル名が格納される。
if 文の右辺に記述されている、特殊変数__main__
は、Python コマンドから直接実行されたときに、この名前が格納される。
Python のスクリプトは、インポートしただけでファイルに記述した処理が実行されてしまう。しかし、自動実行が困るケースもある。できることなら、インポートされたときは自動実行をさせず、スクリプトとして直接実行したときだけ処理を行いたい。
そんなときに、この if 文で判定すると スクリプトとして直接実行したときのみ処理を行う ことができる。
Python のコードは、コマンドから直接実行されるか、他のプログラムをインポートして呼ばれる。その判定を行うことができる。インポート元のファイルの末尾に以下を加えることで、スクリプトとしても使えるようになる。
if __name__ == "__main__":
関数
まとめると、このコードは 「コマンドラインからスクリプトとして直接実行したときに、以降の処理を行う」 という意味である。
ひとまず、__name__
を「モジュール名」、__main__
を「直接実行」と解釈すると理解しやすい。
直接実行とは、コマンドから「python ファイル名.py」と入力することである。
記述方法
読込先のファイル
import インポート元
print('処理')
インポート元のファイル
def main()
print('処理')
if __name__ == "__main__":
main()
この記述を使うことで、インポートしたときに自動実行されないように判定しているので、実行したいコードと実行したくないコードを分けることができる。
変数 __name__
には、モジュール名が格納されている。Python のコードを直接実行すると、 __main__
として認識される。
モジュールがコマンドに渡されたときに、変数 __name__
の値が __main__
になる。