__name__
もその一種です。__name__
は、直接実行されたスクリプトに組み込まれるモジュール名が代入された変数です。__name__
の基本的な使用例if __name__ == "__main__":
です。__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.py
import 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
で、動的インポート対象のモジュールによって処理を分けたいときに使う、などの使い所があります。