if __name__ == “__main__”: 前にも聞いたかもだけど、この1行が理解不能なんだよね。歴史的経緯も含めて教えて。なぜアンダーライン2つなの?なんなの、これ?
ショートアンサーを先に書いておくと
Pythonでは、スクリプト(
.py
ファイル)が実行されると、そのファイルには自動的に特殊な変数__name__
が与えられます。
- スクリプトが直接実行された場合:
__name__ == "__main__"
- 他のスクリプトから
import
された場合:__name__
にはそのモジュール名(ファイル名)が入る
ChatGPT:
if __name__ == "__main__":
とは?
Pythonにおける エントリーポイント(プログラムの実行開始地点)を明示するための構文 です。この行があることで、そのスクリプトが 「直接実行されたとき」 にのみ実行され、他のモジュールからインポートされた場合には実行されません。
1. __name__
とは?
Pythonでは、スクリプト(.py
ファイル)が実行されると、そのファイルには自動的に特殊な変数 __name__
が与えられます。
- スクリプトが直接実行された場合:
__name__ == "__main__"
- 他のスクリプトから
import
された場合:__name__
にはそのモジュール名(ファイル名)が入る
例1: スクリプトを直接実行
# script.py
print(f"__name__ = {__name__}")
if __name__ == “__main__”:print(“This script is being run directly”)
実行
$ python script.py
出力
__name__ = __main__
This script is being run directly
👉 __name__
は __main__
になり、if
ブロック内のコードが実行される。
例2: モジュールとしてインポート
# main.py
import script
print("Main script is running")
実行
$ python main.py
出力
__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__":
は、モジュールの再利用性を高め、スクリプトのエントリーポイントを明確にするための標準的な書き方 です。
特に「スクリプトとしても実行できるし、モジュールとしてもインポートできる」コードを書くときには、ぜひ使ってください! 😊