対象の読者
Pythonを学習中の方、またはPythonの特殊変数__name__と'__main__'の使い方について理解を深めたい方向けの記事です。
__name__
Pythonのモジュール、クラス、関数はそれぞれ__name__という特別な属性を持っています。モジュールの場合、__name__の値はそのモジュール名(.pyを除いたファイル名)になります。クラスや関数の場合、__name__の値はそのクラス名や関数名になります。
class MyClass:
pass
def function():
pass
import example
print("Module name: ", example.__name__)
print("Class name: ", example.MyClass.__name__)
print("Function name: ", example.function.__name__)
このanother_file.pyを実行すると、以下の出力が得られます。
Module name: example
Class name: MyClass
Function name: function
'__main__'
'__main__'は、Pythonファイルがスクリプトとして直接実行されたときに__name__変数に設定される値です。
これはプログラムのエントリーポイントを表します。
print(__name__)
このexample.pyを直接実行すると、以下の出力が得られます。
__main__
if __name__ == '__main__'
if __name__ == '__main__'という条件式は、ファイルがスクリプトとして直接実行された場合にのみTrueとなります。これにより、ファイルが直接実行されたときだけ実行したいコードをこの条件式の中に記述することができます。ファイルがインポートされた場合、この条件式の中のコードは実行されません。
def function():
print("This is a module function")
if __name__ == '__main__':
print("This is a script")
このexample.pyを直接実行すると、以下の出力が得られます。
This is a script
しかし、別のファイルからexampleをインポートしてfunction()を呼び出すと、"This is a script"は出力されません。
import example
example.function()
このanother_file.pyを実行すると、以下の出力が得られます。
This is a module function
このように、__name__と__main__を使うことで、ファイルがスクリプトとして実行されているのか、他のファイルからインポートされているのかを区別し、それに応じた動作をさせることができます。これは、モジュールを再利用しやすくするためのPythonの便利な機能です。
また、Pythonファイルがモジュールとして実行された場合と直接実行された場合で、__name__変数の値が異なることを利用して、特定のコードをモジュールとして実行された場合だけ、または直接実行された場合だけに実行させることも可能です。
if __name__ == "__main__":
# このコードはファイルが直接実行された場合にのみ実行されます
print("This file was run directly")
else:
# このコードはファイルがモジュールとしてインポートされた場合にのみ実行されます
print("This file was imported as a module")
まとめ
Pythonの特殊変数__name__と'__main__'を理解することで、Pythonのコードをより効率的に再利用することができます。
参考資料
用語の解説
-
モジュール
Pythonファイルが他のPythonファイルからインポートされて使用される場合、そのファイルはモジュールとして扱われます。
モジュールは、関数、クラス、変数などを定義し、それらを他のPythonファイルから再利用するためのものです。
モジュールの名前は、Pythonファイルの名前(.py拡張子を除く)になります。 -
スクリプト
Pythonファイルが直接実行される場合、そのファイルはスクリプトとして扱われます。
スクリプトは、一連の命令を含み、それらの命令は上から下へと順番に実行されます。 -
エントリーポイント
プログラムの実行が始まる場所であり、通常はプログラムの最初に呼び出される関数やコードブロックを指します。
Pythonにおいて、if __name__ == '__main__'の中のコードがエントリーポイントとなる。