PYTHONのプログラムで「if __name__ == “__main__”」を見かけます。
これは一体どういう役割なのかを説明しますね。
__name__は関数が収められるグローバル変数
PYTHONの正式ホームページには下記の説明がされています。
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__”』でプログラムを書いていくようにすれば、色々と利便性が理解できるようになってくると思うので、今はこういうことがあるんだと頭の隅に記憶しておくだけで大丈夫です。
「役に立った!」と思れましたら、下のSNSボタンで記事のシェアをしていただけると嬉しいです!
コメント