ホームページ >バックエンド開発 >Python チュートリアル >Python で `if __name__ == '__main__':` は何をするのか、そしてそれがなぜ重要なのか?

Python で `if __name__ == '__main__':` は何をするのか、そしてそれがなぜ重要なのか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-24 03:52:14747ブラウズ

What Does `if __name__ ==

name == "__main__": 何をするのか、なぜ必要ですか?

Python スクリプトがメイン プログラムとして実行される場合、インタープリタは特殊変数 __name__ を "__main__" に割り当てます。スクリプトが別のプログラムによってモジュールとしてインポートされる場合、__name__ はインポートするモジュールの名前に設定されます。

これが重要である理由を理解するには、次の例を考えてください:

# Suppose this is foo.py.

print("before import")
import math

print("before function_a")
def function_a():
    print("Function A")

print("before function_b")
def function_b():
    print("Function B {}".format(math.sqrt(100)))

print("before __name__ guard")
if __name__ == '__main__':
    function_a()
    function_b()
print("after __name__ guard")

実行フロー:

  1. 特殊変数のセットアップ:

    • name は、次のように「__main__」に設定されます。 foo.pyはメインとして実行されますProgram.
  2. コードの実行:

    • スクリプトは、すべてのコードを 1 行ずつ実行します:

      • 「インポート前」に出力し、数学モジュールをロードし、など。
      • 関数 function_a と function_b を定義します。
    • name チェックが評価されます。「main」と一致するため、 if ブロックが実行されます (「関数 A」と「関数 B 10.0」を出力します)。
    • 以下のコードname チェックが実行されます (「after name__ ガード」を出力します)。

name チェックの重要性:

このチェックは重要ですなぜなら:

  • 誤った呼び出しからの保護: foo.py に name チェックがない場合、それをモジュールとしてインポートすると、スクリプトがトリガーされます。インポートするスクリプトのコマンドライン引数を使用して実行します。通常は、
  • Pickle ファイルの問題: foo.py にカスタム クラスが pickle ファイルに保存されている場合、別のスクリプトで unpickle すると foo.py がインポートされ、 なしでコードが実行されます。 name チェックにより、上記の問題が発生します。

追加注:

  • スクリプト内で複数の name チェックを使用できますが、それは一般的ではありません。
  • name は、「a1」、「m1」、「a2」、「b」に含まれる結果をチェックします。 「a3」、「m2」、「t2」、name を削除すると、結果は「a1」、「a2」、「b」、「a3」、「t2」になります。
  • foo3.py をスクリプトとして実行すると、結果は「t1」、「a1」、「a2」、「b」、「a3」、「t2」になります。
  • foo4.py で __name__ を "__main__" に設定すると (モジュールとしてインポートされた場合でも)、__name__ == __main__ は常に True と評価されるため、インポート時にスクリプトが常に実行されます。 .

以上がPython で `if __name__ == '__main__':` は何をするのか、そしてそれがなぜ重要なのか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。