sec05 - 第2章: Pythonで必須!if __name__ == '__main__': の意味と__name__、ネームスペースの基本

前回のレクチャーで、パッケージとモジュールの分け方と、importの仕方を学習しました。このレクチャーでは、各モジュールが直接実行された時と、importで読み込まれた時の区別の仕方を学習します。

Pythonでは、「どう実行されたか」を判断するための仕組みが用意されています。それが今回学ぶ、__name__if __name__ == '__main__'です。

スポンサーリンク

Pythonの __name__ の意味とは?しくみと役割をわかりやすく解説

Pythonには、スクリプトを実行する際に自動的に定義される「特殊変数」がいくつかあります。その中のひとつが__name__(ダブルアンダースコアで囲まれた名前)です。

__name__は「このスクリプトがどのように実行されたか」を表します。つまり、「このファイルが直接実行されたのか、他のファイルからimportされたのか」を判別するための目印です。

__name__ を確認するサンプルコード(check_name.py / import_test.py)

fortune_cookieのパッケージとは別に、check_name.pyimport_test.pyを作成します。(2つのファイルは、同じディレクトリに作ります。)

# check_name.py

print('このファイルの __name__ は:', __name__)

このコードは、__name__の値を表示するだけの、非常にシンプルなものです。

# import_test.py

import check_name

__name__ の値がどう変わるか実行結果で確認する

① まずはcheck_name.pyを直接実行してみましょう。VisualStudioCodeでcheck_name.pyを開き、実行します。

出力結果:

このファイルの __name__ は: __main__

② 次に、このファイルをimport_test.pyからimportしてみましょう。VisualStudioCodeでimport_test.pyを開き、実行します。

出力結果:

このファイルの __name__ は: check_name

つまり、__name__の値は、ファイルを直接実行したときには"__main__"に、他のファイルからimportされたときには"モジュール名"(ファイル名から拡張子.pyを除いたもの)になります。Pythonはこの値を使って、「どのように実行されたのか」を判断しているのです。

Pythonの if __name__ == '__main__' の意味と使い方を徹底解説

上の仕組みを利用すると、次のようなコードを書けるようになります。

def main():
    print('メイン処理を実行します')

if __name__ == '__main__':
    main()

この構文の意味はとてもシンプルです。

「もしこのファイルが直接実行されたときだけ、main()を実行してね」

これを入れておくことで、他のファイルからこのモジュールをimportしたときに、自動的にmain()が動いてしまうのを防ぐことができます。いわば「勝手に動かないようにする安全装置」です。

スポンサーリンク

Pythonのネームスペースとは?モジュールごとに独立する仕組み

ここで、あわせて理解しておきたい大切な考え方があります。それが「ネームスペース(namespace・名前空間)」です。

ネームスペースとは、変数や関数の「名前」を管理するための独立した箱のようなものです。Pythonでは、各モジュールごとに独立したネームスペースが作られています。あるモジュールの中で定義した関数や変数は、別のモジュールには影響しません。

つまり、直接実行しているモジュールモジュールAモジュールBmain()という同じ名前の関数をもっていても、それぞれ完全に独立して管理されます。それぞれ、main(), A.main(), B.main()と記述することで、指定したモジュールのmain()を実行することができます。

モジュール間で変数が独立する理由と実例コード

fortune_cookieのパッケージとは別に、module_a.py, module_b.py, main.pyを作成し、mainモジュールを実行してみてください。

# module_a.py
value = 'Aの値'
# module_b.py
value = 'Bの値'
# main.py
import module_a
import module_b

print(module_a.value)
print(module_b.value)

出力結果:

Aの値
Bの値

同じvalueという変数名を使っていても、各モジュールの中で独立して管理されているのが確認できます。これがネームスペースの仕組みです。

__name__ と __main__・ネームスペースのポイント総まとめ

概念内容
__name__モジュールの識別名を表す特殊変数
"__main__"ファイルを直接実行した際に__name__に代入される値
if __name__ == '__main__':ファイルを直接実行した時に、ブロック内の処理を実行させるための構文
ネームスペース(namespace・名前空間)変数や関数を識別するための、モジュールごとに独立した管理空間
スポンサーリンク