【第11回PYTHON講座】『if __name__ == “__main__”』を理解する

PYTHON

PYTHONのプログラムで「if __name__ == “__main__”」を見かけます。

これは一体どういう役割なのかを説明しますね。

__name__は関数が収められるグローバル変数

PYTHONの正式ホームページには下記の説明がされています。

__main__‘ はトップレベルのコードが実行されるスコープの名前です。モジュールが、標準入力から読み込まれたとき、スクリプトとして実行されたとき、あるいはインタラクティブプロンプトのとき、__name__ には ‘__main__‘ が設定されます。
簡単に言うと、「__name__」動作しているモジュール(関数)名を収められるグローバル変数ということなのですが、イメージが付きにくいので、実際にコードで試してみます。

test01.pyというファイルを作り、下記の1行を書いて実行します。

print(__name__)

実行結果は下記になります。

#test01.pyの実行結果 
__main__

__name__」の中に「__main__」が格納されているという事が解ります。

2つのファイル使って『__name__』の確認

次に「__name__」の中に__main__」以外の値が格納される場を試してみます。

2つのファイル「test01.py」、「test02.py」を作成し、それぞれに下記のコードを書いてみます。

#test01.pyに書くコード
print(f"test01.pyでのprint結果は:{__name__}")
#test02.pyに書くコード
print("test01のインポート前")
print(f"test02.pyでのprint結果は:{__name__}")
import test01
print("test01のインポート後")
print(f"test02.pyでのprint結果は:{__name__}")

test01.pyを実行すると「__main__」が出力されますが、test02.pyを実行すると下記が出力されます。

test01のインポート前
test02.pyでのprint結果は:__main__
test01.pyでのprint結果は:test01
test01のインポート後
test02.pyでのprint結果は:__main__

❶test02のプログラムが実行され、「__name__」に「__main__」が格納され、❷インポートしたtest01のプログラムが実行され、「__name__」に「test01」が格納され、❸test02のプログラムが実行され「__name__」に「__main__」が格納されます。

つまり、実行されるモジュールの名前が__name__に格納されることになります。

2つのプログラムがある場合、呼び出す側でプログラムが実行されれば「__main__」になり、呼び出される側でプログラムが実行されると、そのモジュール名「test01」が格納されます。

『if __name__ == “__main__”』を使って理解を深める

実際に『if __name__ == “__main__”』を使ってより理解を深めましょう。

test01.pyを下記の通り書き直します。

def func01():
    print(f"test01.pyでのprint結果は>>>{__name__}")

if __name__ == '__main__':
    func01()

test01.pyを実行すると、下記の様に表示されます。

test01.pyでのprint結果は>>>__main__

test01.pyが実行されれば”test01.pyでのprint結果は>>>__main__“と表示されることに注目して下さい。

次にtest02.pyを下記の通り書き直します。

import test01
print(f"test02.pyでのprint結果は>>>{__name__}")

test02.pyを実行すると、下記の通りになります

test02.pyでのprint結果は>>>__main__

import test01」をしているのにも関わらず、「test01.pyでのprint結果は>>>__main__」という出力が無いことが分かります。

これはtest02からtest01のプログラムを実行した際に、「__name__」には「test01」というモジュール名が格納されているからです。

つまり、『if __name__ == ‘__main__’』の条件文は、その条件文が記載されているプログラム自体のみ有効になります。

『if __name__ == ‘__main__’』で宣言する内容は、そのモジュール自体で動かしたいプログラムで、他のモジュールから呼び出された時には実行させないプログラムになります。

まとめ

いかがだったでしょうか。

少し理解しにくかったかもしれませんが、『if __name__ == “__main__”』でプログラムを書いていくようにすれば、色々と利便性が理解できるようになってくると思うので、今はこういうことがあるんだと頭の隅に記憶しておくだけで大丈夫です。

役に立った!」と思れましたら、下のSNSボタンで記事のシェアをしていただけると嬉しいです!

コメント

タイトルとURLをコピーしました