Pythonにはいくつかの特殊な変数があり、__name__もその一種です。
Pythonにおける__name__は、直接実行されたスクリプトに組み込まれるモジュール名が代入された変数です。
__name__の基本的な使用例
代表的な使い方はif __name__ == "__main__":です。
Pythonのプログラムを直接実行する際に__name__には__main__という文字列が代入されます。
実際に見てみましょう。
sample.pyを作成し、以下を記述してみてください。
print(__name__)
print(type(__name__))以下のコマンドで実行します。
python sample.py出力結果は以下です。
__main__
<class 'str'>これは共通で、直接実行されたスクリプトの__name__には__main__が入ります。したがって、Pythonスクリプトを直接実行する際には、以下のような書き方が一般化しているのです。
def say_hello(name: str) -> str:
return f"Hello {name}!"
if __name__ == "__main__":
print(say_hello("World"))__name__の別の使用例
次に、他のモジュールから参照されたり、関数内で参照した場合はどうなるか見ていきましょう。
以下のように同じディレクトリ内にhoge.py、huga.py、そしてpiyo.pyを作って試していきます。
$ tree
.
├── hoge.py
├── huga.py
└── piyo.pyimport huga
import piyo
print(__name__)
huga.huga_func()
p = piyo.PiyoCls()
p.piyo_func()def huga_func():
print(__name__)class PiyoCls:
def __init__(self):
print(__name__)
def piyo_func(self):
print(__name__)hoge.pyを中心にスクリプトを実行する形です。
実行してみましょう。
python hoge.py$ python hoge.py
__main__
huga
piyo
piyoまず、直接実行対象のhoge.pyで最初に説明した__main__が出力されます。
その次にhuga_func()内の__name__はhugaモジュールであるため、hugaが出力されます。
クラスが含まれるpiyo.pyは、インスタンス生成で__init__内のprint(__name__)が出力され、その後にpiyo_func()のprint(__name__)が出力されています。
piyo.pyはモジュール自体がpiyoのため、piyoが出力されます。
__name__の使い所
単純に__name__はモジュール名を取得できる変数ですが、使い所は== "__main__"だけではありません。
動的にモジュールインポートしたい際によく使われるimportlib.import_moduleで、動的インポート対象のモジュールによって処理を分けたいときに使う、などの使い所があります。
Pythonの特殊変数や関数はたくさんありますが、使い方を覚えておくと美しいコーディングにつながります。
デフォルトで備わっている機能に習熟して、より良いプログラミングライフを目指しましょう。





