奇妙な1文 if __name__ == “__main__”: の意味

if __name__ == “__main__”:  前にも聞いたかもだけど、この1行が理解不能なんだよね。歴史的経緯も含めて教えて。なぜアンダーライン2つなの?なんなの、これ?

ショートアンサーを先に書いておくと

Pythonでは、スクリプト(.py ファイル)が実行されると、そのファイルには自動的に特殊な変数 __name__ が与えられます。

  • スクリプトが直接実行された場合: __name__ == "__main__"
  • 他のスクリプトから import された場合: __name__ にはそのモジュール名(ファイル名)が入る
以下、ロングアンサーです。
ChatGPT:
ChatGPT

if __name__ == "__main__": とは?

Pythonにおける エントリーポイント(プログラムの実行開始地点)を明示するための構文 です。この行があることで、そのスクリプトが 「直接実行されたとき」 にのみ実行され、他のモジュールからインポートされた場合には実行されません。


1. __name__ とは?

Pythonでは、スクリプト(.py ファイル)が実行されると、そのファイルには自動的に特殊な変数 __name__ が与えられます。

  • スクリプトが直接実行された場合: __name__ == "__main__"
  • 他のスクリプトから import された場合: __name__ にはそのモジュール名(ファイル名)が入る

例1: スクリプトを直接実行

python
# script.py
print(f"__name__ = {__name__}")
if __name__ == “__main__”:
print(“This script is being run directly”)

実行

bash
$ python script.py

出力

markdown
__name__ = __main__
This script is being run directly

👉 __name____main__ になり、if ブロック内のコードが実行される。


例2: モジュールとしてインポート

python
# main.py
import script
print("Main script is running")

実行

bash
$ python main.py

出力

arduino
__name__ = script
Main script is running

👉 script.pyインポートされたので __name__script になり、if __name__ == "__main__": 内のコードは実行されない!


2. if __name__ == "__main__": が必要な理由

① 他のスクリプトからインポートしても実行されないようにする

例えば、script.py には 関数定義やクラス、計算ロジックだけを含めたい が、誤って import しただけで実行されるのを防ぐ。

# script.py
def hello():
print("Hello from script.py!")
if __name__ == “__main__”:
print(“This script is being run directly”)

インポート

import script
script.hello()

出力

Hello from script.py!

👉 if __name__ == "__main__": がなければ、インポート時に print("This script is being run directly") も実行されてしまう!


② CLIツールやスクリプトの実行エントリーポイントとして使う

Pythonのスクリプトが単独で実行される場合、そのスクリプトの中に main() 関数を定義し、「エントリーポイント」として if __name__ == "__main__": main() を記述するのが一般的な構成

def main():
print("Hello, World!")
if __name__ == “__main__”:
main()

👉 このようにすることで、コードを整理し、可読性を向上させる!


3. __name__ にアンダースコア __ が2つある理由

Python の特殊変数(Dunder variables)

Pythonでは __name__ のように「ダブルアンダースコア (__)」が前後につく変数を ダンダースコア(Dunder, “Double UNDERscore”)変数 と呼びます。

これは Python が内部的に予約している特別な変数 であり、ユーザーが通常の変数として使わないようにするための設計です。

Python の特殊変数の例

変数 意味
__name__ 現在のモジュール名 (__main__ ならスクリプトとして実行)
__file__ 実行中のスクリプトのファイル名
__init__ クラスのコンストラクタ
__str__ str(object) を定義する特殊メソッド
__repr__ repr(object) を定義する特殊メソッド

4. if __name__ == "__main__": の歴史的経緯

Python 1.0 から存在

  • Python では 1990年代初期から __name__ という概念が存在
  • Python 1.0(1994年リリース)から if __name__ == "__main__": という構文が導入され、現在まで変わっていない

もともと import で意図しないコード実行を防ぐため

  • もともと Python は 「スクリプトとしても実行できるし、モジュールとしても使える」 という設計思想を持っていた。
  • しかし、Python では import module_name を実行すると、その .py ファイル内のコードが すべて実行されてしまう
  • これを防ぐために if __name__ == "__main__": を使うことで、スクリプト実行時とモジュール利用時を区別するようになった

5. まとめ

概要 説明
__name__ とは? Pythonスクリプトが実行されると自動で設定される変数
"__main__" とは? スクリプトが「直接実行された」場合に __name__ に入る値
if __name__ == "__main__": の役割 スクリプトとして直接実行された場合のみ、特定のコードを実行するため
なぜ _ が2つある? Python の「特殊変数(Dunder 変数)」であり、予約されたものだから
なぜ歴史的に必要? import したときに意図しないコードが実行されないようにするため

🔹 最後に

Python の if __name__ == "__main__": は、モジュールの再利用性を高め、スクリプトのエントリーポイントを明確にするための標準的な書き方 です。

特に「スクリプトとしても実行できるし、モジュールとしてもインポートできる」コードを書くときには、ぜひ使ってください! 😊