__name__ == __main__とは|Pythonのお勉強
2022/1/12 2022/4/15

Pythonで見かける以下のようなコードについてです。

def main():
pass
if __name__ == '__main__':
main()
メインのスクリプトから呼び出されるモジュールに記載するおまじないだそうです。私なりにどのようなカラクリか説明します。(他言語かじりのPythonデビューな私にはちょっと異様なコードに感じました)
呼び出される側のモジュールに以下を記載したとします。
# Name of this module is ykHello.py
# This module will be called by ykMain.py
def ykHello(arg=None):
print("Bonjour!!")
print("Bon Voyage!!")
関数内の「Bonjour」と外の「Bon Voyage」があります。
次にメインのスクリプト(呼び出す側)の内容を以下とします。
# This script imports ykHello.py
import ykHello
# Run a function in ykHello.py
#ykHello.ykHello()
一番下のykHello()という関数が「呼び出される側」のモジュールの中に見覚えがありますが、コメントアウトしています。つまり、モジュールのインポートしかしていない状況です。
この状況でメインスクリプトを実行すると以下のような結果となります。
*** Remote Interpreter Reinitialized ***
Bon Voyage!!
>>>
このように、インポートしただけでモジュール内の関数が実行されてしまいます。インポートしただけで勝手に実行されると困りますね。
これを防ぐのが、このおまじないです。
