Pythonにおける「if__name_='_main_':」の理解とまとめ

6061 ワード

1はじめに
Pythonでは、コードが規範的に書かれている場合、プログラムの入口として「if__name_=」_main_:」と書くのが普通ですが、このようなコードがないようで、プログラムも正常に動作します.このコードは余計ですか?原理はどこにあるの?本編の博文はこれについて総括的に説明する.
2プログラムエントリ
Java、C、C++を学んだプログラマーは、プログラムを開くたびに、プログラムの入り口、つまり私たちがよく言うmain関数として主関数を書かなければならないことを知っているはずです.以下に示すように、main()はJavaのmain関数の1つです.
public class HelloWorld {

    public static void main(String[] args) {

        System.out.println("HelloWorld");

    }

}    

Java、C、C++などのいくつかの言語とは異なり、Pythonは解釈型スクリプト言語であり、実行前にはすべてのコードを先に中間コードにコンパイルし、Pythonプログラムの実行時にはモジュールの先頭行から、行ごとに翻訳実行するので、最上位層(インデントされていない)のコードが実行されるため、Pythonではプログラムのエントリとして統一されたmain()は必要ありません.ある意味では、「if__name_=」_main_:」も、Javaなどの言語におけるプログラムマスターエントリを象徴するフラグのように、コードエントリがここにあることを他のプログラマーに伝えます.これは、「if__name_=」_main_:」というコードの意味の一つです.
3モジュールのインポート
モジュールAのコードをモジュールBでimport Aすると、モジュールAのコードがそのimport文に実行される限り、モジュールAのコードが実行されることを知っています.
モジュールA:
#   A

a = 100

print('  ,    A……')

print(a)

モジュールB:
#   B

from package01 import A

b = 200

print('  ,    B……')

print(b)

モジュールBを運転した場合、出力結果は以下の通りである.
こんにちは、モジュールAですが...
  100
こんにちは、モジュールBですが...
  200
モジュールAでは、一部のコードがBにインポートされたときに直接実行されたくないが、Aを直接実行したときに直接実行できる場合、どうすればいいのでしょうか.では、「if__name_==」_main_:」という行のコードを使うことができます.私たちのチームで使用したAモジュールコードを修正します.
Aモジュールコードを以下に変更する.
#   A

a = 100

print('  ,    A……')

if __name__=='__main__':

    print(a)

Bモジュールは修正せず、直接Bモジュールを実行し、出力結果は以下の通りである.
こんにちは、モジュールAですが...
こんにちは、モジュールBですが...
  200
見ましたか、Aモジュールのaの値はもう出力されません.したがって、モジュールをインポートしたいが、モジュールの一部のコードを変更したくない場合は、この部分のコードを「if_name_='_main_:」の内部に置くことができます.
4 “__name__”「_main_」と
今でも心の中で疑問に思っているかもしれませんが、なぜそうなったのか、今は「if__name_='_main_:」の原理についてお話しします.
         “__name__”Pythonの内蔵変数で、現在のモジュールを指します.上記のAモジュールとBモジュールを修正し、モジュールの名前をそれぞれ出力します.
モジュールA:
#   A

print('  ,    A……')

print('  A __name__  :{}'.format(__name__))

print('-------------------------')

モジュールB:
#   B

from package01 import A

print('  ,    B……')

print('  B __name__  :{}'.format(__name__))

Aモジュール実行時、結果を出力する:
こんにちは、モジュールAですが...
モジュールA中_name__の値:_main__
  -------------------------
Bモジュール実行時、結果を出力する:
こんにちは、モジュールAですが...
モジュールA中_name__の値:package 01.A
  -------------------------
こんにちは、モジュールBですが...
モジュールB中_name__の値:_main__
不思議なところを見つけましたか?どのモジュールが直接実行されるか、そのモジュール「_name_」の値が「_main_」で、別のモジュールにインポートされると、「_name_」の値は、モジュールの実際の名前です.クラス比で説明します.子供の頃は交代で教室を計画していたのを覚えています.自分の番になったとき(モジュールが直接実行されたとき)、私たちは今日が「私」(_main_)の当番だと言います.他の人を呼ぶとき、私たちは直接彼らの名前を呼びます.だから、「__main_」当事者、あるいは一人称の「私」に相当する.
したがって、if__name_='_main_':'文を実行すると、現在のモジュールで直接実行される場合、_name__の値は_です.main__,条件判定の結果、Trueとなり、「if__name_='_main_:」の下のコードブロックが実行される.
5まとめ
「if__name_='_main_:」:文の使い方や原理もだいたいはっきりしていますが、はっきり言わなかったり、理解できなかったりしたら、メッセージをください.また、「if__name_='_main_:」は無駄に見えることが多いが、コードの規範性から必要である.