Pythonの__name__の挙動を詳しく知る
Pythonスクリプトによくあるのがこれだ。
if __name__ == '__main__'
この説明は以下で詳しくされている。__name__にはモジュールのファイル名から.pyを除いたものが入るのだそうだ。
https://note.nkmk.me/python-if-name-main/
が、なんだか腑におちなかったので確かめてみた。
つまりはファイル名ではなく、呼び出したモジュール名なのでは?という疑問だ。 試してみたら、やはりファイル名だった。
スクリプトをそのまま起動したときの挙動
次のように実験した。
print('This is __name__ test.')
def nametest():
print(__name__)
if __name__ == '__main__':
nametest()
This is __name__ test. __main__
モジュールとして読み込んだときの挙動
先程のスクリプトを"maintest.py"として保存して、次のスクリプトを実行する。
def func(): print('Hello!') print('__name__ is', __name__) maintest.nametest()
実行結果はこうだ。
This is __name__ test. maintest
まず、モジュールを読み込んだときに、「This is name test.」が表示される。 これは、関数等に入っていないので、読み込み時に実行されるようだ。
一般的にはモジュールの初期設定をするときに使うようだ。
次に、maintest.nametest()を呼ぶと、モジュールのnametest関数が呼ばれて、モジュール名である「maintest」が表示される。
モジュールに別名を付けたときの挙動
気になっていたのは、
import maintest as mt def func(): print('Hello!') print('__name__ is', __name__) mt.nametest()
実行結果はこうだ。
This is __name__ test. maintest
asで別名をモジュールに付けたら、その__name__も__mt__のように別名がつくのかな?と思ったけど、そんなことはなかった。