Python入門【「if __name__ == ‘__main__’:」について】

python name

こんにちは、ミナトです。

Pythonのプログラムで以下のような記述をみたことがあるかと思います。

if __name__ == '__main__':
    main()

「なんとなく書いていたけど、この記述は何?どういう意味?」

と思われたことはないでしょうか?

今回は「if __name__ == ‘__main__‘:」について解説します。

今回はPythonでよく見る「if __name__ == ‘__main__’:」について解説するな😆
以下のような方を対象としています
  • 「if __name__ == ‘__main__‘:」の意味を知りたい
  • Pythonでプログラミングを学びたい

「if __name__ == ‘__main__’:」のとは?

結論をお伝えすると、「if __name__ == ‘__main__’:」を用いるとモジュールのインポート時にプログラムが予想外に実行されるのを防ぐためのおまじないのようなものです。

モジュールの詳細については以下の記事をご確認ください。

Python Module

Python入門【モジュールとパッケージの使い方】

2021年6月27日

Pythonのプログラムでモジュールをインポートすると__name__変数に自動的に値がセットされます。

__name__にセットされる値はモジュール名となります。(module1.pyというファイルならmodule1となります。)

また、python module1.pyのように直接スクリプトファイルを実行した際、__name__は「__main__」となります。

つまり、「if __name__ == ‘__main__’:」があると直接モジュールを実行した際のみif文の中の処理を実行することになり、インポート時、想定外に処理が実行されるということがなくなります。

説明だけだと分かりにくいので、実際にプログラムを動かして確認してみます。

「if __name__ == ‘__main__’:」の使い方

「if __name__ == ‘__main__’:」がない場合

まず、「if __name__ == ‘__main__’:」がない場合の動作を確認します。

def say_hello():
    print('hello')


say_hello()

上記のモジュールをmain.pyから読み込んで、実行してみましょう。

main.pyではmodule1.pyのsay_hello()関数を一度だけ実行したいはずですが、インポート時にもsay_hello()関数が実行され計2回実行されてしまいます。

これでは、思わぬバグに繋がってしまいます。

import module1


def main():
    module1.say_hello()


if __name__ == '__main__':
    main()

## 出力
hello ## import時に実行されてしまう
hello

「if __name__ == ‘__main__’:」がある場合

続いて、module1.pyに「if __name__ == ‘__main__’:」を追加した場合の処理を確認してみましょう。

今度は一度だけ「hello」が出力されます。

def say_hello():
    print('hello')


if __name__ == '__main__':
    say_hello()
import module1


def main():
    module1.say_hello()


if __name__ == '__main__':
    main()

## 出力
hello

試しにターミナルでpython module1.pyを実行してください。この場合は、module1.pyのif文の中の処理が実行されます。

__name__変数の確認

最後に__name__がどのように変化するか確認してみます。

デバッグ用でmodule1.pyに一行追加します。

def say_hello():
    print('hello')


print(__name__) # 追加
if __name__ == '__main__':
    say_hello()

この状態で、module1.pyとmain.pyのそれぞれを実行してみてください。
module1.pyを実行した際は__name__が「__main__」となり、main.pyを実行した場合は「module1」となります。

python module1.py

## 出力
__main__  ## ここに注目
hello


python main.py

## 出力
module1 ## ここに注目
hello

まとめ

今回はPythonでよく見かける「if __name__ == ‘__main__’:」の記述について解説しました。

「if __name__ == ‘__main__’:」を用いるとモジュールのインポート時にプログラムが予想外に実行されるのを防ぐことができます。

本ブログの中でも、説明を簡略化するためにあえて、「if __name__ == ‘__main__’:」を使わずに記述してる箇所があります。

しかし、実際のアプリケーション開発においては、自分の書いたプログラムを他の人が読み込むケースもあるため、想定外に処理が実行されないように通常は「if __name__ == ‘__main__’:」を記述すると覚えておいてください。

最後まで読んでいただき、ありがとうございます。

この記事が「面白いな」、「勉強になったな」という方は、SNSでシェアしていただけると嬉しいです。