Pythonの__name__を理解する

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__のように別名がつくのかな?と思ったけど、そんなことはなかった。

コメント

comments powered by Disqus