Python if __name__ == __ main__コード例で説明

PythonインタープリターがPythonファイルを読み取るとき、最初にいくつかの特別な変数を設定します。次に、ファイルからコードを実行します。

それらの変数の1つはと呼ばれ__name__ます。

この記事をステップバイステップで実行し、そのコードスニペットを読むと、の使用方法if __name__ == "__main__"と、それが非常に重要である理由がわかります。

Pythonモジュールの説明

Pythonファイルはモジュールと呼ばれ、.pyファイル拡張子で識別されます。モジュールは、関数、クラス、および変数を定義できます。

したがって、インタプリタがモジュールを実行すると、実行中のモジュールがメインプログラムであるかの__name__ように変数が設定され  __main__ます。

ただし、コードが別のモジュールからモジュールをインポートしている場合、__name__  変数はそのモジュールの名前に設定されます。

例を見てみましょう。名前の付いたPythonモジュールを作成し、file_one.pyこのトップレベルのコードを次の中に貼り付けます。

# Python file one module print("File one __name__ is set to: {}" .format(__name__))

このファイルを実行することにより、私たちが話していたことを正確に確認できます。__name__このモジュールの変数は次のように設定され__main__ます:

File one __name__ is set to: __main__

次に、という名前の別のファイルを追加しfile_two.py、このコードを次の中に貼り付けます。

# Python module to import print("File two __name__ is set to: {}" .format(__name__)) 

また、次のようにコードを変更してfile_one.pyfile_twoモジュールをインポートします。

# Python module to execute import file_two print("File one __name__ is set to: {}" .format(__name__)) 

file_oneコードをもう一度実行すると、の__name__変数がfile_one変更されておらず、に設定され__main__たままであることが示されます。しかし、現在、変数__name__infile_twoはそのモジュール名として設定されているため、file_two

結果は次のようになります。

File two __name__ is set to: file_two File one __name__ is set to: __main__ 

ただし、file_two直接実行すると、名前が次のように設定されていることがわかります__main__

File two __name__ is set to: __main__ 

__name__実行されるファイル/モジュールの変数は常に__main__です。ただし、__name__インポートされる他のすべてのモジュールの変数は、それらのモジュールの名前に設定されます。

Pythonファイルの命名規則

使用しての通常の方法__name____main__次のようになります。

if __name__ == "__main__": Do something here 

これが実際にどのように機能するか、そしてこれらの変数を実際に使用する方法を見てみましょう。

変更file_onefile_twoこのように見えるように:

file_one

# Python module to execute import file_two print("File one __name__ is set to: {}" .format(__name__)) if __name__ == "__main__": print("File one executed when ran directly") else: print("File one executed when imported") 

file_two

# Python module to import print("File two __name__ is set to: {}" .format(__name__)) if __name__ == "__main__": print("File two executed when ran directly") else: print("File two executed when imported") 

繰り返しfile_oneますが、実行すると、プログラムがこれら2つのモジュールのどちらであるかを認識__main__し、最初のif elseステートメントに従ってコードを実行したことがわかります。

結果は次のようになります。

File two __name__ is set to: file_two File two executed when imported File one __name__ is set to: __main__ File one executed when ran directly 

ここで実行するfile_twoと、__name__変数が次のように設定されていることがわかります__main__

File two __name__ is set to: __main__ File two executed when ran directly 

このようなモジュールをインポートして実行すると、それらの関数がインポートされ、最上位のコードが実行されます。

このプロセスの動作を確認するには、ファイルを次のように変更します。

file_one

# Python module to execute import file_two print("File one __name__ is set to: {}" .format(__name__)) def function_one(): print("Function one is executed") def function_two(): print("Function two is executed") if __name__ == "__main__": print("File one executed when ran directly") else: print("File one executed when imported") 

file_two

# Python module to import print("File two __name__ is set to: {}" .format(__name__)) def function_three(): print("Function three is executed") if __name__ == "__main__": print("File two executed when ran directly") else: print("File two executed when imported") 

これで、関数はロードされますが、実行されません。

これらの関数の1つを実行するには、のif __name__ == "__main__"部分を次のように変更file_oneします。

if __name__ == "__main__": print("File one executed when ran directly") function_two() else: print("File one executed when imported") 

実行file_oneすると、次のように表示されます。

File two __name__ is set to: file_two File two executed when imported File one __name__ is set to: __main__ File one executed when ran directly Function two is executed 

また、インポートしたファイルから関数を実行することもできます。これを行うには、のif __name__ == “__main__”部分を次のように変更file_oneします。

if __name__ == "__main__": print("File one executed when ran directly") function_two() file_two.function_three() else: print("File one executed when imported") 

そして、あなたはこのような結果を期待することができます:

File two __name__ is set to: file_two File two executed when imported File one __name__ is set to: __main__ File one executed when ran directly Function two is executed Function three is executed 

ここで、file_twoモジュールが非常に大きく、多くの関数(この場合は2つ)があり、それらすべてをインポートしたくないとしましょう。次のfile_twoように変更します。

# Python module to import print("File two __name__ is set to: {}" .format(__name__)) def function_three(): print("Function three is executed") def function_four(): print("Function four is executed") if __name__ == "__main__": print("File two executed when ran directly") else: print("File two executed when imported") 

And to import the specific functions from the module, use the from import block in the file_one file:

# Python module to execute from file_two import function_three print("File one __name__ is set to: {}" .format(__name__)) def function_one(): print("Function one is executed") def function_two(): print("Function two is executed") if __name__ == "__main__": print("File one executed when ran directly") function_two() function_three() else: print("File one executed when imported")

Conclusion

There is a really nice use case for the __name__ variable, whether you want a file that can be run as the main program or imported by other modules. We can use an if __name__ == "__main__" block to allow or prevent parts of code from being run when the modules are imported.

When the Python interpreter reads a file, the __name__ variable is set as __main__ if the module being run, or as the module's name if it is imported. Reading the file executes all top level code, but not functions and classes (since they will only get imported).

Bra gjort! (That means "Well done" in Swedish!)

Check out more articles like this on my freeCodeCamp profile, Medium profile, and other fun stuff I build on my GitHub page.